diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 9fccd0b46f32481684e993d66b081cd4580b5cf0..733b7838760934c31177f99ea512e969dc761cfb 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -44,7 +44,7 @@ class Shared_Cache extends Cache {
 		$source = \OC_Share_Backend_File::getSource($target);
 		if (isset($source['path']) && isset($source['fileOwner'])) {
 			\OC\Files\Filesystem::initMountPoints($source['fileOwner']);
-			$mount = \OC\Files\Mount::findByNumericId($source['storage']);
+			$mount = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
 			if ($mount) {
 				$fullPath = $mount->getMountPoint().$source['path'];
 				list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($fullPath);
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index ffd4e5ced22bdd1264b2898b6b62bbe646f4be07..2facad0f7e2fe6c34e1a04e4b1a6eb0ea646861e 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -71,7 +71,7 @@ class Shared extends \OC\Files\Storage\Common {
 		if ($source) {
 			if (!isset($source['fullPath'])) {
 				\OC\Files\Filesystem::initMountPoints($source['fileOwner']);
-				$mount = \OC\Files\Mount::findByNumericId($source['storage']);
+				$mount = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
 				if ($mount) {
 					$this->files[$target]['fullPath'] = $mount->getMountPoint().$source['path'];
 				} else {
diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 71b70abe3fec5f586cf3f191e3fc8bc6b7d97c39..857fe980be640b74f446d29edc1b30f25164b766 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -30,11 +30,9 @@ class Cache {
 	private $storageId;
 
 	/**
-	 * numeric storage id
-	 *
-	 * @var int $numericId
+	 * @var Storage $storageCache
 	 */
-	private $numericId;
+	private $storageCache;
 
 	private $mimetypeIds = array();
 	private $mimetypes = array();
@@ -52,19 +50,11 @@ class Cache {
 			$this->storageId = md5($this->storageId);
 		}
 
-		$query = \OC_DB::prepare('SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?');
-		$result = $query->execute(array($this->storageId));
-		if ($row = $result->fetchRow()) {
-			$this->numericId = $row['numeric_id'];
-		} else {
-			$query = \OC_DB::prepare('INSERT INTO `*PREFIX*storages`(`id`) VALUES(?)');
-			$query->execute(array($this->storageId));
-			$this->numericId = \OC_DB::insertid('*PREFIX*storages');
-		}
+		$this->storageCache = new Storage($storage);
 	}
 
 	public function getNumericStorageId() {
-		return $this->numericId;
+		return $this->storageCache->getNumericId();
 	}
 
 	/**
@@ -111,7 +101,7 @@ class Cache {
 	public function get($file) {
 		if (is_string($file) or $file == '') {
 			$where = 'WHERE `storage` = ? AND `path_hash` = ?';
-			$params = array($this->numericId, md5($file));
+			$params = array($this->getNumericStorageId(), md5($file));
 		} else { //file id
 			$where = 'WHERE `fileid` = ?';
 			$params = array($file);
@@ -198,14 +188,14 @@ class Cache {
 
 			list($queryParts, $params) = $this->buildParts($data);
 			$queryParts[] = '`storage`';
-			$params[] = $this->numericId;
+			$params[] = $this->getNumericStorageId();
 			$valuesPlaceholder = array_fill(0, count($queryParts), '?');
 
 			$query = \OC_DB::prepare('INSERT INTO `*PREFIX*filecache`(' . implode(', ', $queryParts) . ')'
 				. ' VALUES(' . implode(', ', $valuesPlaceholder) . ')');
 			$result = $query->execute($params);
 			if (\OC_DB::isError($result)) {
-				\OCP\Util::writeLog('cache', 'Insert to cache failed: '.$result, \OCP\Util::ERROR);
+				\OCP\Util::writeLog('cache', 'Insert to cache failed: ' . $result, \OCP\Util::ERROR);
 			}
 
 			return (int)\OC_DB::insertid('*PREFIX*filecache');
@@ -264,7 +254,7 @@ class Cache {
 		$pathHash = md5($file);
 
 		$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?');
-		$result = $query->execute(array($this->numericId, $pathHash));
+		$result = $query->execute(array($this->getNumericStorageId(), $pathHash));
 
 		if ($row = $result->fetchRow()) {
 			return $row['fileid'];
@@ -353,7 +343,7 @@ class Cache {
 	 */
 	public function clear() {
 		$query = \OC_DB::prepare('DELETE FROM `*PREFIX*filecache` WHERE storage = ?');
-		$query->execute(array($this->numericId));
+		$query->execute(array($this->getNumericStorageId()));
 
 		$query = \OC_DB::prepare('DELETE FROM `*PREFIX*storages` WHERE id = ?');
 		$query->execute(array($this->storageId));
@@ -367,7 +357,7 @@ class Cache {
 	public function getStatus($file) {
 		$pathHash = md5($file);
 		$query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?');
-		$result = $query->execute(array($this->numericId, $pathHash));
+		$result = $query->execute(array($this->getNumericStorageId(), $pathHash));
 		if ($row = $result->fetchRow()) {
 			if ((int)$row['size'] === -1) {
 				return self::SHALLOW;
@@ -394,7 +384,7 @@ class Cache {
 			SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `etag`
 			FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `storage` = ?'
 		);
-		$result = $query->execute(array($pattern, $this->numericId));
+		$result = $query->execute(array($pattern, $this->getNumericStorageId()));
 		$files = array();
 		while ($row = $result->fetchRow()) {
 			$row['mimetype'] = $this->getMimetype($row['mimetype']);
@@ -421,7 +411,7 @@ class Cache {
 			FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `storage` = ?'
 		);
 		$mimetype = $this->getMimetypeId($mimetype);
-		$result = $query->execute(array($mimetype, $this->numericId));
+		$result = $query->execute(array($mimetype, $this->getNumericStorageId()));
 		$files = array();
 		while ($row = $result->fetchRow()) {
 			$row['mimetype'] = $this->getMimetype($row['mimetype']);
@@ -459,7 +449,7 @@ class Cache {
 			return 0;
 		}
 		$query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*filecache` WHERE `parent` = ? AND `storage` = ?');
-		$result = $query->execute(array($id, $this->numericId));
+		$result = $query->execute(array($id, $this->getNumericStorageId()));
 		$totalSize = 0;
 		$hasChilds = 0;
 		while ($row = $result->fetchRow()) {
@@ -486,7 +476,7 @@ class Cache {
 	 */
 	public function getAll() {
 		$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ?');
-		$result = $query->execute(array($this->numericId));
+		$result = $query->execute(array($this->getNumericStorageId()));
 		$ids = array();
 		while ($row = $result->fetchRow()) {
 			$ids[] = $row['fileid'];
@@ -506,7 +496,7 @@ class Cache {
 	public function getIncomplete() {
 		$query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`'
 			. ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1');
-		$result = $query->execute(array($this->numericId));
+		$result = $query->execute(array($this->getNumericStorageId()));
 		if ($row = $result->fetchRow()) {
 			return $row['path'];
 		} else {
@@ -517,6 +507,7 @@ class Cache {
 	/**
 	 * get the storage id of the storage for a file and the internal path of the file
 	 *
+	 * @param int $id
 	 * @return array, first element holding the storage id, second the path
 	 */
 	static public function getById($id) {
@@ -529,10 +520,8 @@ class Cache {
 			return null;
 		}
 
-		$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?');
-		$result = $query->execute(array($numericId));
-		if ($row = $result->fetchRow()) {
-			return array($row['id'], $path);
+		if ($id = Storage::getStorageId($numericId)) {
+			return array($id, $path);
 		} else {
 			return null;
 		}
diff --git a/lib/files/cache/storage.php b/lib/files/cache/storage.php
new file mode 100644
index 0000000000000000000000000000000000000000..72de376798cde270c7f4a507ae2244d8506d13cb
--- /dev/null
+++ b/lib/files/cache/storage.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Files\Cache;
+
+/**
+ * Class Storage
+ *
+ * cache storage specific data
+ *
+ * @package OC\Files\Cache
+ */
+class Storage {
+	private $storageId;
+	private $numericId;
+
+	/**
+	 * @param \OC\Files\Storage\Storage|string $storage
+	 */
+	public function __construct($storage) {
+		if ($storage instanceof \OC\Files\Storage\Storage) {
+			$this->storageId = $storage->getId();
+		} else {
+			$this->storageId = $storage;
+		}
+		if (strlen($this->storageId) > 64) {
+			$this->storageId = md5($this->storageId);
+		}
+
+		$query = \OC_DB::prepare('SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?');
+		$result = $query->execute(array($this->storageId));
+		if ($row = $result->fetchRow()) {
+			$this->numericId = $row['numeric_id'];
+		} else {
+			$query = \OC_DB::prepare('INSERT INTO `*PREFIX*storages`(`id`) VALUES(?)');
+			$query->execute(array($this->storageId));
+			$this->numericId = \OC_DB::insertid('*PREFIX*storages');
+		}
+	}
+
+	public function getNumericId() {
+		return $this->numericId;
+	}
+
+	public static function getStorageId($numericId) {
+		$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?');
+		$result = $query->execute(array($numericId));
+		if ($row = $result->fetchRow()) {
+			return $row['id'];
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/lib/files/filesystem.php b/lib/files/filesystem.php
index 09732e67ac618d2e2c1dd11bee8e47f2814b9ccf..ad21a98fabcf46dbaf89a7ae8785b2086daf5117 100644
--- a/lib/files/filesystem.php
+++ b/lib/files/filesystem.php
@@ -34,6 +34,11 @@ const FREE_SPACE_UNKNOWN = -2;
 const FREE_SPACE_UNLIMITED = -3;
 
 class Filesystem {
+	/**
+	 * @var Mount\Manager $mounts
+	 */
+	private static $mounts;
+
 	public static $loaded = false;
 	/**
 	 * @var \OC\Files\View $defaultInstance
@@ -147,7 +152,7 @@ class Filesystem {
 	 * @return string
 	 */
 	static public function getMountPoint($path) {
-		$mount = Mount::find($path);
+		$mount = self::$mounts->find($path);
 		if ($mount) {
 			return $mount->getMountPoint();
 		} else {
@@ -163,7 +168,7 @@ class Filesystem {
 	 */
 	static public function getMountPoints($path) {
 		$result = array();
-		$mounts = Mount::findIn($path);
+		$mounts = self::$mounts->findIn($path);
 		foreach ($mounts as $mount) {
 			$result[] = $mount->getMountPoint();
 		}
@@ -177,10 +182,26 @@ class Filesystem {
 	 * @return \OC\Files\Storage\Storage
 	 */
 	public static function getStorage($mountPoint) {
-		$mount = Mount::find($mountPoint);
+		$mount = self::$mounts->find($mountPoint);
 		return $mount->getStorage();
 	}
 
+	/**
+	 * @param $id
+	 * @return Mount\Mount[]
+	 */
+	public static function getMountByStorageId($id) {
+		return self::$mounts->findByStorageId($id);
+	}
+
+	/**
+	 * @param $id
+	 * @return Mount\Mount[]
+	 */
+	public static function getMountByNumericId($id) {
+		return self::$mounts->findByStorageId($id);
+	}
+
 	/**
 	 * resolve a path to a storage and internal path
 	 *
@@ -188,7 +209,7 @@ class Filesystem {
 	 * @return array consisting of the storage and the internal path
 	 */
 	static public function resolvePath($path) {
-		$mount = Mount::find($path);
+		$mount = self::$mounts->find($path);
 		if ($mount) {
 			return array($mount->getStorage(), $mount->getInternalPath($path));
 		} else {
@@ -201,6 +222,7 @@ class Filesystem {
 			return false;
 		}
 		self::$defaultInstance = new View($root);
+		self::$mounts = new Mount\Manager();
 
 		//load custom mount config
 		self::initMountPoints($user);
@@ -210,6 +232,10 @@ class Filesystem {
 		return true;
 	}
 
+	static public function initMounts(){
+		self::$mounts = new Mount\Manager();
+	}
+
 	/**
 	 * Initialize system and personal mount points for a user
 	 *
@@ -328,7 +354,7 @@ class Filesystem {
 	 * clear all mounts and storage backends
 	 */
 	public static function clearMounts() {
-		Mount::clear();
+		self::$mounts->clear();
 	}
 
 	/**
@@ -339,7 +365,8 @@ class Filesystem {
 	 * @param string $mountpoint
 	 */
 	static public function mount($class, $arguments, $mountpoint) {
-		new Mount($class, $mountpoint, $arguments);
+		$mount = new Mount\Mount($class, $mountpoint, $arguments);
+		self::$mounts->addMount($mount);
 	}
 
 	/**
diff --git a/lib/files/mount/manager.php b/lib/files/mount/manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..25a5fe241cc131bc2b76aa401b95de9a97054ef9
--- /dev/null
+++ b/lib/files/mount/manager.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Files\Mount;
+
+use \OC\Files\Filesystem;
+
+class Manager {
+	/**
+	 * @var Mount[]
+	 */
+	private $mounts = array();
+
+	/**
+	 * @param Mount $mount
+	 */
+	public function addMount($mount) {
+		$this->mounts[$mount->getMountPoint()] = $mount;
+	}
+
+	/**
+	 * Find the mount for $path
+	 *
+	 * @param $path
+	 * @return Mount
+	 */
+	public function find($path) {
+		\OC_Util::setupFS();
+		$path = $this->formatPath($path);
+		if (isset($this->mounts[$path])) {
+			return $this->mounts[$path];
+		}
+
+		\OC_Hook::emit('OC_Filesystem', 'get_mountpoint', array('path' => $path));
+		$foundMountPoint = '';
+		$mountPoints = array_keys($this->mounts);
+		foreach ($mountPoints as $mountpoint) {
+			if (strpos($path, $mountpoint) === 0 and strlen($mountpoint) > strlen($foundMountPoint)) {
+				$foundMountPoint = $mountpoint;
+			}
+		}
+		if (isset($this->mounts[$foundMountPoint])) {
+			return $this->mounts[$foundMountPoint];
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Find all mounts in $path
+	 *
+	 * @param $path
+	 * @return Mount[]
+	 */
+	public function findIn($path) {
+		\OC_Util::setupFS();
+		$path = $this->formatPath($path);
+		$result = array();
+		$pathLength = strlen($path);
+		$mountPoints = array_keys($this->mounts);
+		foreach ($mountPoints as $mountPoint) {
+			if (substr($mountPoint, 0, $pathLength) === $path and strlen($mountPoint) > $pathLength) {
+				$result[] = $this->mounts[$mountPoint];
+			}
+		}
+		return $result;
+	}
+
+	public function clear() {
+		$this->mounts = array();
+	}
+
+	/**
+	 * Find mounts by storage id
+	 *
+	 * @param string $id
+	 * @return Mount[]
+	 */
+	public function findByStorageId($id) {
+		\OC_Util::setupFS();
+		if (strlen($id) > 64) {
+			$id = md5($id);
+		}
+		$result = array();
+		foreach ($this->mounts as $mount) {
+			if ($mount->getStorageId() === $id) {
+				$result[] = $mount;
+			}
+		}
+		return $result;
+	}
+
+	/**
+	 * Find mounts by numeric storage id
+	 *
+	 * @param string $id
+	 * @return Mount
+	 */
+	public function findByNumericId($id) {
+		$storageId = \OC\Files\Cache\Storage::getStorageId($id);
+		return $this->findByStorageId($storageId);
+	}
+
+	/**
+	 * @param string $path
+	 * @return string
+	 */
+	private function formatPath($path) {
+		$path = Filesystem::normalizePath($path);
+		if (strlen($path) > 1) {
+			$path .= '/';
+		}
+		return $path;
+	}
+}
diff --git a/lib/files/mount.php b/lib/files/mount/mount.php
similarity index 54%
rename from lib/files/mount.php
rename to lib/files/mount/mount.php
index 0030d0ee7a637fc3607103d3ca719b58d669450c..69b8285ab4c210fd7fbffbb761a2dba1a28320dd 100644
--- a/lib/files/mount.php
+++ b/lib/files/mount/mount.php
@@ -6,13 +6,12 @@
  * See the COPYING-README file.
  */
 
-namespace OC\Files;
+namespace OC\Files\Mount;
+
+use \OC\Files\Filesystem;
 
 class Mount {
-	/**
-	 * @var Mount[]
-	 */
-	static private $mounts = array();
+
 
 	/**
 	 * @var \OC\Files\Storage\Storage $storage
@@ -33,7 +32,7 @@ class Mount {
 			$arguments = array();
 		}
 
-		$mountpoint = self::formatPath($mountpoint);
+		$mountpoint = $this->formatPath($mountpoint);
 		if ($storage instanceof \OC\Files\Storage\Storage) {
 			$this->class = get_class($storage);
 			$this->storage = $storage;
@@ -46,8 +45,6 @@ class Mount {
 			$this->arguments = $arguments;
 		}
 		$this->mountPoint = $mountpoint;
-
-		self::$mounts[$this->mountPoint] = $this;
 	}
 
 	/**
@@ -58,6 +55,8 @@ class Mount {
 	}
 
 	/**
+	 * create the storage that is mounted
+	 *
 	 * @return \OC\Files\Storage\Storage
 	 */
 	private function createStorage() {
@@ -121,103 +120,11 @@ class Mount {
 	 * @param string $path
 	 * @return string
 	 */
-	private static function formatPath($path) {
+	private function formatPath($path) {
 		$path = Filesystem::normalizePath($path);
 		if (strlen($path) > 1) {
 			$path .= '/';
 		}
 		return $path;
 	}
-
-	/**
-	 * Find the mount for $path
-	 *
-	 * @param $path
-	 * @return Mount
-	 */
-	public static function find($path) {
-		\OC_Util::setupFS();
-		$path = self::formatPath($path);
-		if (isset(self::$mounts[$path])) {
-			return self::$mounts[$path];
-		}
-
-		\OC_Hook::emit('OC_Filesystem', 'get_mountpoint', array('path' => $path));
-		$foundMountPoint = '';
-		$mountPoints = array_keys(self::$mounts);
-		foreach ($mountPoints as $mountpoint) {
-			if (strpos($path, $mountpoint) === 0 and strlen($mountpoint) > strlen($foundMountPoint)) {
-				$foundMountPoint = $mountpoint;
-			}
-		}
-		if (isset(self::$mounts[$foundMountPoint])) {
-			return self::$mounts[$foundMountPoint];
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Find all mounts in $path
-	 *
-	 * @param $path
-	 * @return Mount[]
-	 */
-	public static function findIn($path) {
-		\OC_Util::setupFS();
-		$path = self::formatPath($path);
-		$result = array();
-		$pathLength = strlen($path);
-		$mountPoints = array_keys(self::$mounts);
-		foreach ($mountPoints as $mountPoint) {
-			if (substr($mountPoint, 0, $pathLength) === $path and strlen($mountPoint) > $pathLength) {
-				$result[] = self::$mounts[$mountPoint];
-			}
-		}
-		return $result;
-	}
-
-	public static function clear() {
-		self::$mounts = array();
-	}
-
-	/**
-	 * Find mounts by storage id
-	 *
-	 * @param string $id
-	 * @return Mount[]
-	 */
-	public static function findByStorageId($id) {
-		\OC_Util::setupFS();
-		if (strlen($id) > 64) {
-			$id = md5($id);
-		}
-		$result = array();
-		foreach (self::$mounts as $mount) {
-			if ($mount->getStorageId() === $id) {
-				$result[] = $mount;
-			}
-		}
-		return $result;
-	}
-
-	/**
-	 * Find mounts by numeric storage id
-	 *
-	 * @param string $id
-	 * @return Mount
-	 */
-	public static function findByNumericId($id) {
-		$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?');
-		$result = $query->execute(array($id))->fetchOne();
-		if ($result) {
-			$id = $result;
-			foreach (self::$mounts as $mount) {
-				if ($mount->getStorageId() === $id) {
-					return $mount;
-				}
-			}
-		}
-		return false;
-	}
 }
diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php
index 38fe5e546f6be008daa43ad64a6cfc870afb8aa7..e87fe3b5239bde3c75e3e9b5c79fe1ac3c67e2d4 100644
--- a/lib/files/storage/common.php
+++ b/lib/files/storage/common.php
@@ -25,6 +25,7 @@ abstract class Common implements \OC\Files\Storage\Storage {
 	private $scanner;
 	private $permissioncache;
 	private $watcher;
+	private $storageCache;
 
 	public function __construct($parameters) {
 	}
@@ -300,6 +301,13 @@ abstract class Common implements \OC\Files\Storage\Storage {
 		return $this->watcher;
 	}
 
+	public function getStorageCache(){
+		if (!isset($this->storageCache)) {
+			$this->storageCache = new \OC\Files\Cache\Storage($this);
+		}
+		return $this->storageCache;
+	}
+
 	/**
 	 * get the owner of a path
 	 *
@@ -361,7 +369,7 @@ abstract class Common implements \OC\Files\Storage\Storage {
 	 * get the free space in the storage
 	 *
 	 * @param $path
-	 * return int
+	 * @return int
 	 */
 	public function free_space($path) {
 		return \OC\Files\FREE_SPACE_UNKNOWN;
diff --git a/lib/files/storage/storage.php b/lib/files/storage/storage.php
index 1da82da2163402c09c1cf3848ab07a0dcb2557d0..c96caebf4af6307d22fc3ebb375f46e0792ae770 100644
--- a/lib/files/storage/storage.php
+++ b/lib/files/storage/storage.php
@@ -328,6 +328,11 @@ interface Storage {
 	 */
 	public function getWatcher($path = '');
 
+	/**
+	 * @return \OC\Files\Cache\Storage
+	 */
+	public function getStorageCache();
+
 	/**
 	 * get the ETag for a file or folder
 	 *
diff --git a/lib/files/view.php b/lib/files/view.php
index 0da104c107e1329add61725dcb34a247581d7ac1..f89b7f66ffdf95fceaa23131554b23dc37322dc4 100644
--- a/lib/files/view.php
+++ b/lib/files/view.php
@@ -977,7 +977,7 @@ class View {
 	 */
 	public function getPath($id) {
 		list($storage, $internalPath) = Cache\Cache::getById($id);
-		$mounts = Mount::findByStorageId($storage);
+		$mounts = Filesystem::getMountByStorageId($storage);
 		foreach ($mounts as $mount) {
 			/**
 			 * @var \OC\Files\Mount $mount
diff --git a/lib/public/share.php b/lib/public/share.php
index 4b337530be8200ecc2d941d19096728998174a0b..525fe7e853310e18dfa7f53a793597f04b9222fb 100644
--- a/lib/public/share.php
+++ b/lib/public/share.php
@@ -875,7 +875,7 @@ class Share {
 					$row['path'] = '/Shared/'.basename($row['path']);
 				} else {
 					if (!isset($mounts[$row['storage']])) {
-						$mounts[$row['storage']] = \OC\Files\Mount::findByNumericId($row['storage']);
+						$mounts[$row['storage']] = \OC\Files\Filesystem::getMountByNumericId($row['storage']);
 					}
 					if ($mounts[$row['storage']]) {
 						$path = $mounts[$row['storage']]->getMountPoint().$row['path'];
diff --git a/lib/util.php b/lib/util.php
index 810593358a5e2d352eedae0ef2c119913955d162..f62c2a42d7300975fbb011f3fc47e0ec646046c4 100755
--- a/lib/util.php
+++ b/lib/util.php
@@ -38,6 +38,7 @@ class OC_Util {
 
 		$CONFIG_DATADIRECTORY = OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" );
 		//first set up the local "root" storage
+		\OC\Files\Filesystem::initMounts();
 		if(!self::$rootMounted) {
 			\OC\Files\Filesystem::mount('\OC\Files\Storage\Local', array('datadir'=>$CONFIG_DATADIRECTORY), '/');
 			self::$rootMounted=true;
diff --git a/tests/lib/files/mount.php b/tests/lib/files/mount.php
deleted file mode 100644
index a3dc06cc66887b7a8cd7f3d111b1f3b45337432d..0000000000000000000000000000000000000000
--- a/tests/lib/files/mount.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace Test\Files;
-
-use \OC\Files\Storage\Temporary;
-
-class LongId extends Temporary {
-	public function getId() {
-		return 'long:' . str_repeat('foo', 50) . parent::getId();
-	}
-}
-
-class Mount extends \PHPUnit_Framework_TestCase {
-	public function setup() {
-		\OC_Util::setupFS();
-		\OC\Files\Mount::clear();
-	}
-
-	public function testFind() {
-		$this->assertNull(\OC\Files\Mount::find('/'));
-
-		$rootMount = new \OC\Files\Mount(new Temporary(array()), '/');
-		$this->assertEquals($rootMount, \OC\Files\Mount::find('/'));
-		$this->assertEquals($rootMount, \OC\Files\Mount::find('/foo/bar'));
-
-		$storage = new Temporary(array());
-		$mount = new \OC\Files\Mount($storage, '/foo');
-		$this->assertEquals($rootMount, \OC\Files\Mount::find('/'));
-		$this->assertEquals($mount, \OC\Files\Mount::find('/foo/bar'));
-
-		$this->assertEquals(1, count(\OC\Files\Mount::findIn('/')));
-		new \OC\Files\Mount(new Temporary(array()), '/bar');
-		$this->assertEquals(2, count(\OC\Files\Mount::findIn('/')));
-
-		$id = $mount->getStorageId();
-		$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId($id));
-
-		$mount2 = new \OC\Files\Mount($storage, '/foo/bar');
-		$this->assertEquals(array($mount, $mount2), \OC\Files\Mount::findByStorageId($id));
-	}
-
-	public function testLong() {
-		$storage = new LongId(array());
-		$mount = new \OC\Files\Mount($storage, '/foo');
-
-		$id = $mount->getStorageId();
-		$storageId = $storage->getId();
-		$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId($id));
-		$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId($storageId));
-		$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId(md5($storageId)));
-	}
-}
diff --git a/tests/lib/files/mount/manager.php b/tests/lib/files/mount/manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..154c35ccead2b7d94700de031712b548976711f4
--- /dev/null
+++ b/tests/lib/files/mount/manager.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files\Mount;
+
+use \OC\Files\Storage\Temporary;
+
+class LongId extends Temporary {
+	public function getId() {
+		return 'long:' . str_repeat('foo', 50) . parent::getId();
+	}
+}
+
+class Manager extends \PHPUnit_Framework_TestCase {
+	/**
+	 * @var \OC\Files\Mount\Manager
+	 */
+	private $manager;
+
+	public function setup() {
+		$this->manager = new \OC\Files\Mount\Manager();
+	}
+
+	public function testFind() {
+		$this->assertNull($this->manager->find('/'));
+
+		$rootMount = new \OC\Files\Mount\Mount(new Temporary(array()), '/');
+		$this->manager->addMount($rootMount);
+		$this->assertEquals($rootMount, $this->manager->find('/'));
+		$this->assertEquals($rootMount, $this->manager->find('/foo/bar'));
+
+		$storage = new Temporary(array());
+		$mount1 = new \OC\Files\Mount\Mount($storage, '/foo');
+		$this->manager->addMount($mount1);
+		$this->assertEquals($rootMount, $this->manager->find('/'));
+		$this->assertEquals($mount1, $this->manager->find('/foo/bar'));
+
+		$this->assertEquals(1, count($this->manager->findIn('/')));
+		$mount2 = new \OC\Files\Mount\Mount(new Temporary(array()), '/bar');
+		$this->manager->addMount($mount2);
+		$this->assertEquals(2, count($this->manager->findIn('/')));
+
+		$id = $mount1->getStorageId();
+		$this->assertEquals(array($mount1), $this->manager->findByStorageId($id));
+
+		$mount3 = new \OC\Files\Mount\Mount($storage, '/foo/bar');
+		$this->manager->addMount($mount3);
+		$this->assertEquals(array($mount1, $mount3), $this->manager->findByStorageId($id));
+	}
+
+	public function testLong() {
+		$storage = new LongId(array());
+		$mount = new \OC\Files\Mount\Mount($storage, '/foo');
+		$this->manager->addMount($mount);
+
+		$id = $mount->getStorageId();
+		$storageId = $storage->getId();
+		$this->assertEquals(array($mount), $this->manager->findByStorageId($id));
+		$this->assertEquals(array($mount), $this->manager->findByStorageId($storageId));
+		$this->assertEquals(array($mount), $this->manager->findByStorageId(md5($storageId)));
+	}
+}
diff --git a/tests/lib/streamwrappers.php b/tests/lib/streamwrappers.php
index 2237ee7d3781c61e72e1875002144a3803962561..c7e51ccfa48560c0f682b5e34198c70170eed0c8 100644
--- a/tests/lib/streamwrappers.php
+++ b/tests/lib/streamwrappers.php
@@ -77,10 +77,10 @@ class Test_StreamWrappers extends PHPUnit_Framework_TestCase {
 	}
 
 	public function testOC() {
-		\OC\Files\Mount::clear();
+		\OC\Files\Filesystem::clearMounts();
 		$storage = new \OC\Files\Storage\Temporary(array());
 		$storage->file_put_contents('foo.txt', 'asd');
-		new \OC\Files\Mount($storage, '/');
+		\OC\Files\Filesystem::mount($storage, array(), '/');
 
 		$this->assertTrue(file_exists('oc:///foo.txt'));
 		$this->assertEquals('asd', file_get_contents('oc:///foo.txt'));