diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index ea14f7adbcf69c46d59c3f4786077dca3ab5de0e..707563096f883da09ce5c0d821635ed1811adb2f 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -177,3 +177,5 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP', array(
 		'password' => '*'.$l->t('Password'),
 		'root' => '&'.$l->t('Root'))));
 
+$mountProvider = new \OCA\Files_External\Config\ConfigAdapter();
+\OC::$server->getMountProviderCollection()->registerProvider($mountProvider);
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 898dc0c8543b3f43c4f9e7a576f624492e72ded9..b4ab8b70f3358519696eb6bbdec2a6d08bf26d8e 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -103,22 +103,6 @@ class OC_Mount_Config {
 	 * @param array $data
 	 */
 	public static function initMountPointsHook($data) {
-		$mountPoints = self::getAbsoluteMountPoints($data['user']);
-		$loader = \OC\Files\Filesystem::getLoader();
-		$manager = \OC\Files\Filesystem::getMountManager();
-		foreach ($mountPoints as $mountPoint => $options) {
-			if (isset($options['options']['objectstore'])) {
-				$objectClass = $options['options']['objectstore']['class'];
-				$options['options']['objectstore'] = new $objectClass($options['options']['objectstore']);
-			}
-			if (isset($options['personal']) && $options['personal']) {
-				$mount = new \OCA\Files_External\PersonalMount($options['class'], $mountPoint, $options['options'], $loader);
-			} else{
-				$mount = new \OC\Files\Mount\Mount($options['class'], $mountPoint, $options['options'], $loader);
-			}
-			$manager->addMount($mount);
-		}
-
 		if ($data['user']) {
 			$user = \OC::$server->getUserManager()->get($data['user']);
 			if (!$user) {
diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..6294e27a774a6722d92b5af029f237b9497084fa
--- /dev/null
+++ b/apps/files_external/lib/config/configadapter.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright (c) 2014 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 OCA\Files_External\Config;
+
+use OC\Files\Mount\MountPoint;
+use OCP\Files\Storage\IStorageFactory;
+use OCA\Files_External\PersonalMount;
+use OCP\Files\Config\IMountProvider;
+use OCP\IUser;
+
+/**
+ * Make the old files_external config work with the new public mount config api
+ */
+class ConfigAdapter implements IMountProvider {
+	/**
+	 * Get all mountpoints applicable for the user
+	 *
+	 * @param \OCP\IUser $user
+	 * @param \OCP\Files\Storage\IStorageFactory $loader
+	 * @return \OCP\Files\Mount\IMountPoint[]
+	 */
+	public function getMountsForUser(IUser $user, IStorageFactory $loader) {
+		$mountPoints = \OC_Mount_Config::getAbsoluteMountPoints($user->getUID());
+		$mounts = array();
+		foreach ($mountPoints as $mountPoint => $options) {
+			if (isset($options['options']['objectstore'])) {
+				$objectClass = $options['options']['objectstore']['class'];
+				$options['options']['objectstore'] = new $objectClass($options['options']['objectstore']);
+			}
+			if (isset($options['personal']) && $options['personal']) {
+				$mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader);
+			} else {
+				$mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader);
+			}
+		}
+		return $mounts;
+	}
+}
diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php
index 708128d644ac63457a4f6772bbfa5ffc9473ed74..0c741179139e178d7e035be490c55973adec2b97 100644
--- a/apps/files_external/lib/personalmount.php
+++ b/apps/files_external/lib/personalmount.php
@@ -8,13 +8,13 @@
 
 namespace OCA\Files_External;
 
-use OC\Files\Mount\Mount;
+use OC\Files\Mount\MountPoint;
 use OC\Files\Mount\MoveableMount;
 
 /**
  * Person mount points can be moved by the user
  */
-class PersonalMount extends Mount implements MoveableMount {
+class PersonalMount extends MountPoint implements MoveableMount {
 	/**
 	 * Move the mount point to $target
 	 *
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 3b5483a51083b2c659525a479a5f3f00932237b5..b52e1a5044edb9c300aff5994de859d228fdc700 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -24,7 +24,7 @@ class Manager {
 	private $mountManager;
 
 	/**
-	 * @var \OC\Files\Storage\Loader
+	 * @var \OC\Files\Storage\StorageFactory
 	 */
 	private $storageLoader;
 
@@ -37,10 +37,10 @@ class Manager {
 	 * @param \OCP\IDBConnection $connection
 	 * @param \OC\Files\Mount\Manager $mountManager
 	 * @param \OC\User\Session $userSession
-	 * @param \OC\Files\Storage\Loader $storageLoader
+	 * @param \OC\Files\Storage\StorageFactory $storageLoader
 	 */
 	public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager,
-								\OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) {
+								\OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) {
 		$this->connection = $connection;
 		$this->mountManager = $mountManager;
 		$this->userSession = $userSession;
diff --git a/apps/files_sharing/lib/external/mount.php b/apps/files_sharing/lib/external/mount.php
index e564dded69a00b0c120e832fcbb96a0e9e829295..6fd9882cb2a4bd3f986903eeb02f8c204ba57270 100644
--- a/apps/files_sharing/lib/external/mount.php
+++ b/apps/files_sharing/lib/external/mount.php
@@ -8,9 +8,10 @@
 
 namespace OCA\Files_Sharing\External;
 
+use OC\Files\Mount\MountPoint;
 use OC\Files\Mount\MoveableMount;
 
-class Mount extends \OC\Files\Mount\Mount implements MoveableMount {
+class Mount extends MountPoint implements MoveableMount {
 
 	/**
 	 * @var \OCA\Files_Sharing\External\Manager
@@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount {
 	 * @param string $mountpoint
 	 * @param array $options
 	 * @param \OCA\Files_Sharing\External\Manager $manager
-	 * @param \OC\Files\Storage\Loader $loader
+	 * @param \OC\Files\Storage\StorageFactory $loader
 	 */
 	public function __construct($storage, $mountpoint, $options, $manager, $loader = null) {
 		parent::__construct($storage, $mountpoint, $options, $loader);
diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php
index a93ecfb3b1b767375eac50715eb6145c5e2db2ee..d16dbf89ccf7c38e68ee390748f80810b730559c 100644
--- a/apps/files_sharing/lib/sharedmount.php
+++ b/apps/files_sharing/lib/sharedmount.php
@@ -8,13 +8,13 @@
 
 namespace OCA\Files_Sharing;
 
-use OC\Files\Mount\Mount;
+use OC\Files\Mount\MountPoint;
 use OC\Files\Mount\MoveableMount;
 
 /**
  * Shared mount points can be moved by the user
  */
-class SharedMount extends Mount implements MoveableMount {
+class SharedMount extends MountPoint implements MoveableMount {
 	/**
 	 * @var \OC\Files\Storage\Shared $storage
 	 */
diff --git a/lib/private/files/config/mountprovidercollection.php b/lib/private/files/config/mountprovidercollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..49d026f1bda5faf8efaa2309b6619cc5d87afc30
--- /dev/null
+++ b/lib/private/files/config/mountprovidercollection.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright (c) 2014 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\Config;
+
+use OCP\Files\Config\IMountProviderCollection;
+use OCP\Files\Config\IMountProvider;
+use OCP\Files\Storage\IStorageFactory;
+use OCP\IUser;
+
+class MountProviderCollection implements IMountProviderCollection {
+	/**
+	 * @var \OCP\Files\Config\IMountProvider[]
+	 */
+	private $providers = array();
+
+	/**
+	 * @var \OCP\Files\Storage\IStorageFactory
+	 */
+	private $loader;
+
+	/**
+	 * @param \OCP\Files\Storage\IStorageFactory $loader
+	 */
+	public function __construct(IStorageFactory $loader) {
+		$this->loader = $loader;
+	}
+
+	/**
+	 * Get all configured mount points for the user
+	 *
+	 * @param \OCP\IUser $user
+	 * @return \OCP\Files\Mount\IMountPoint[]
+	 */
+	public function getMountsForUser(IUser $user) {
+		$loader = $this->loader;
+		return array_reduce($this->providers, function ($mounts, IMountProvider $provider) use ($user, $loader) {
+			return array_merge($mounts, $provider->getMountsForUser($user, $loader));
+		}, array());
+	}
+
+	/**
+	 * Add a provider for mount points
+	 *
+	 * @param \OCP\Files\Config\IMountProvider $provider
+	 */
+	public function registerProvider(IMountProvider $provider) {
+		$this->providers[] = $provider;
+	}
+}
diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php
index 6c8fa8c90baf37d30ffb2ca5ec372ff74f28be47..90643839e22befe993c71251b002c260135317e5 100644
--- a/lib/private/files/filesystem.php
+++ b/lib/private/files/filesystem.php
@@ -30,7 +30,7 @@
 
 namespace OC\Files;
 
-use OC\Files\Storage\Loader;
+use OC\Files\Storage\StorageFactory;
 
 class Filesystem {
 
@@ -165,7 +165,7 @@ class Filesystem {
 	const signal_param_users = 'users';
 
 	/**
-	 * @var \OC\Files\Storage\Loader $loader
+	 * @var \OC\Files\Storage\StorageFactory $loader
 	 */
 	private static $loader;
 
@@ -183,7 +183,7 @@ class Filesystem {
 
 	public static function getLoader() {
 		if (!self::$loader) {
-			self::$loader = new Loader();
+			self::$loader = new StorageFactory();
 		}
 		return self::$loader;
 	}
@@ -250,7 +250,7 @@ class Filesystem {
 
 	/**
 	 * @param string $id
-	 * @return Mount\Mount[]
+	 * @return Mount\MountPoint[]
 	 */
 	public static function getMountByStorageId($id) {
 		if (!self::$mounts) {
@@ -261,7 +261,7 @@ class Filesystem {
 
 	/**
 	 * @param int $id
-	 * @return Mount\Mount[]
+	 * @return Mount\MountPoint[]
 	 */
 	public static function getMountByNumericId($id) {
 		if (!self::$mounts) {
@@ -370,6 +370,11 @@ class Filesystem {
 		self::mountCacheDir($user);
 
 		// Chance to mount for other storages
+		if($userObject) {
+			$mountConfigManager = \OC::$server->getMountProviderCollection();
+			$mounts = $mountConfigManager->getMountsForUser($userObject);
+			array_walk($mounts, array(self::$mounts, 'addMount'));
+		}
 		\OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user, 'user_dir' => $root));
 	}
 
@@ -447,7 +452,7 @@ class Filesystem {
 		if (!self::$mounts) {
 			\OC_Util::setupFS();
 		}
-		$mount = new Mount\Mount($class, $mountpoint, $arguments, self::getLoader());
+		$mount = new Mount\MountPoint($class, $mountpoint, $arguments, self::getLoader());
 		self::$mounts->addMount($mount);
 	}
 
diff --git a/lib/private/files/mount/manager.php b/lib/private/files/mount/manager.php
index 0ccf42941decd4fbc133e49aaeda6f2d3f1cda71..8472ebc976a4ee94a99d71a8125fbd597734ea16 100644
--- a/lib/private/files/mount/manager.php
+++ b/lib/private/files/mount/manager.php
@@ -12,14 +12,14 @@ use \OC\Files\Filesystem;
 
 class Manager {
 	/**
-	 * @var Mount[]
+	 * @var MountPoint[]
 	 */
 	private $mounts = array();
 
 	/**
-	 * @param Mount $mount
+	 * @param MountPoint $mount
 	 */
-	public function addMount(Mount $mount) {
+	public function addMount(MountPoint $mount) {
 		$this->mounts[$mount->getMountPoint()] = $mount;
 	}
 
@@ -47,7 +47,7 @@ class Manager {
 	 * Find the mount for $path
 	 *
 	 * @param string $path
-	 * @return Mount
+	 * @return MountPoint
 	 */
 	public function find($path) {
 		\OC_Util::setupFS();
@@ -75,7 +75,7 @@ class Manager {
 	 * Find all mounts in $path
 	 *
 	 * @param string $path
-	 * @return Mount[]
+	 * @return MountPoint[]
 	 */
 	public function findIn($path) {
 		\OC_Util::setupFS();
@@ -99,7 +99,7 @@ class Manager {
 	 * Find mounts by storage id
 	 *
 	 * @param string $id
-	 * @return Mount[]
+	 * @return MountPoint[]
 	 */
 	public function findByStorageId($id) {
 		\OC_Util::setupFS();
@@ -116,7 +116,7 @@ class Manager {
 	}
 
 	/**
-	 * @return Mount[]
+	 * @return MountPoint[]
 	 */
 	public function getAll() {
 		return $this->mounts;
@@ -126,7 +126,7 @@ class Manager {
 	 * Find mounts by numeric storage id
 	 *
 	 * @param int $id
-	 * @return Mount[]
+	 * @return MountPoint[]
 	 */
 	public function findByNumericId($id) {
 		$storageId = \OC\Files\Cache\Storage::getStorageId($id);
diff --git a/lib/private/files/mount/mount.php b/lib/private/files/mount/mountpoint.php
similarity index 90%
rename from lib/private/files/mount/mount.php
rename to lib/private/files/mount/mountpoint.php
index 48c9d88c23c1bc5d014dbd3862700127a035287f..b2c50f9d88128272fe477b60a44cc4a8a5adc662 100644
--- a/lib/private/files/mount/mount.php
+++ b/lib/private/files/mount/mountpoint.php
@@ -9,10 +9,11 @@
 namespace OC\Files\Mount;
 
 use \OC\Files\Filesystem;
-use OC\Files\Storage\Loader;
+use OC\Files\Storage\StorageFactory;
 use OC\Files\Storage\Storage;
+use OCP\Files\Mount\IMountPoint;
 
-class Mount {
+class MountPoint implements IMountPoint {
 	/**
 	 * @var \OC\Files\Storage\Storage $storage
 	 */
@@ -23,7 +24,7 @@ class Mount {
 	protected $mountPoint;
 
 	/**
-	 * @var \OC\Files\Storage\Loader $loader
+	 * @var \OC\Files\Storage\StorageFactory $loader
 	 */
 	private $loader;
 
@@ -31,14 +32,14 @@ class Mount {
 	 * @param string|\OC\Files\Storage\Storage $storage
 	 * @param string $mountpoint
 	 * @param array $arguments (optional)\
-	 * @param \OC\Files\Storage\Loader $loader
+	 * @param \OCP\Files\Storage\IStorageFactory $loader
 	 */
 	public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
 		if (is_null($arguments)) {
 			$arguments = array();
 		}
 		if (is_null($loader)) {
-			$this->loader = new Loader();
+			$this->loader = new StorageFactory();
 		} else {
 			$this->loader = $loader;
 		}
@@ -67,15 +68,6 @@ class Mount {
 		return $this->mountPoint;
 	}
 
-	/**
-	 * get name of the mount point
-	 *
-	 * @return string
-	 */
-	public function getMountPointName() {
-		return basename(rtrim($this->mountPoint, '/'));
-	}
-
 	/**
 	 * @param string $mountPoint new mount point
 	 */
@@ -91,7 +83,7 @@ class Mount {
 	private function createStorage() {
 		if (class_exists($this->class)) {
 			try {
-				return $this->loader->load($this->mountPoint, $this->class, $this->arguments);
+				return $this->loader->getInstance($this->mountPoint, $this->class, $this->arguments);
 			} catch (\Exception $exception) {
 				if ($this->mountPoint === '/') {
 					// the root storage could not be initialized, show the user!
diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php
index 54a699be532d9371bfcb95a0573316a53657d911..6fdcff13e1cbb9ccbf0ecd7334fd8b9121032e3d 100644
--- a/lib/private/files/node/folder.php
+++ b/lib/private/files/node/folder.php
@@ -301,7 +301,7 @@ class Folder extends Node implements \OCP\Files\Folder {
 		$nodes = array();
 		foreach ($mounts as $mount) {
 			/**
-			 * @var \OC\Files\Mount\Mount $mount
+			 * @var \OC\Files\Mount\MountPoint $mount
 			 */
 			if ($mount->getStorage()) {
 				$cache = $mount->getStorage()->getCache();
diff --git a/lib/private/files/node/root.php b/lib/private/files/node/root.php
index 1e8387dc5cbe2a2bfede0dff6d3bedb3cbc39b3f..35132f5458d51af5a9e54f8a3a33ab6c435be109 100644
--- a/lib/private/files/node/root.php
+++ b/lib/private/files/node/root.php
@@ -10,7 +10,7 @@ namespace OC\Files\Node;
 
 use OC\Files\Cache\Cache;
 use OC\Files\Mount\Manager;
-use OC\Files\Mount\Mount;
+use OC\Files\Mount\MountPoint;
 use OCP\Files\NotFoundException;
 use OCP\Files\NotPermittedException;
 use OC\Hooks\Emitter;
@@ -106,13 +106,13 @@ class Root extends Folder implements Emitter {
 	 * @param array $arguments
 	 */
 	public function mount($storage, $mountPoint, $arguments = array()) {
-		$mount = new Mount($storage, $mountPoint, $arguments);
+		$mount = new MountPoint($storage, $mountPoint, $arguments);
 		$this->mountManager->addMount($mount);
 	}
 
 	/**
 	 * @param string $mountPoint
-	 * @return \OC\Files\Mount\Mount
+	 * @return \OC\Files\Mount\MountPoint
 	 */
 	public function getMount($mountPoint) {
 		return $this->mountManager->find($mountPoint);
@@ -120,7 +120,7 @@ class Root extends Folder implements Emitter {
 
 	/**
 	 * @param string $mountPoint
-	 * @return \OC\Files\Mount\Mount[]
+	 * @return \OC\Files\Mount\MountPoint[]
 	 */
 	public function getMountsIn($mountPoint) {
 		return $this->mountManager->findIn($mountPoint);
@@ -128,7 +128,7 @@ class Root extends Folder implements Emitter {
 
 	/**
 	 * @param string $storageId
-	 * @return \OC\Files\Mount\Mount[]
+	 * @return \OC\Files\Mount\MountPoint[]
 	 */
 	public function getMountByStorageId($storageId) {
 		return $this->mountManager->findByStorageId($storageId);
@@ -136,14 +136,14 @@ class Root extends Folder implements Emitter {
 
 	/**
 	 * @param int $numericId
-	 * @return Mount[]
+	 * @return MountPoint[]
 	 */
 	public function getMountByNumericStorageId($numericId) {
 		return $this->mountManager->findByNumericId($numericId);
 	}
 
 	/**
-	 * @param \OC\Files\Mount\Mount $mount
+	 * @param \OC\Files\Mount\MountPoint $mount
 	 */
 	public function unMount($mount) {
 		$this->mountManager->remove($mount);
diff --git a/lib/private/files/storage/loader.php b/lib/private/files/storage/storagefactory.php
similarity index 71%
rename from lib/private/files/storage/loader.php
rename to lib/private/files/storage/storagefactory.php
index c75a0a976a705558964ae4833e9bd6c954847bcd..c9e8d422f9d0ce00403dee87a1f5e0b8599d7d87 100644
--- a/lib/private/files/storage/loader.php
+++ b/lib/private/files/storage/storagefactory.php
@@ -8,7 +8,9 @@
 
 namespace OC\Files\Storage;
 
-class Loader {
+use OCP\Files\Storage\IStorageFactory;
+
+class StorageFactory implements IStorageFactory {
 	/**
 	 * @var callable[] $storageWrappers
 	 */
@@ -19,6 +21,7 @@ class Loader {
 	 *
 	 * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
 	 *
+	 * @param string $wrapperName
 	 * @param callable $callback
 	 */
 	public function addStorageWrapper($wrapperName, $callback) {
@@ -26,15 +29,21 @@ class Loader {
 	}
 
 	/**
+	 * Create an instance of a storage and apply the registered storage wrappers
+	 *
 	 * @param string|boolean $mountPoint
 	 * @param string $class
+	 * @param array $arguments
+	 * @return \OCP\Files\Storage
 	 */
-	public function load($mountPoint, $class, $arguments) {
+	public function getInstance($mountPoint, $class, $arguments) {
 		return $this->wrap($mountPoint, new $class($arguments));
 	}
 
 	/**
 	 * @param string|boolean $mountPoint
+	 * @param \OCP\Files\Storage $storage
+	 * @return \OCP\Files\Storage
 	 */
 	public function wrap($mountPoint, $storage) {
 		foreach ($this->storageWrappers as $wrapper) {
diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index adb66497be074d795e4f40704a0154bc71b8ae09..19a2ed38e1bb5c237e83d9c41aa79dc5b3bacae4 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
@@ -53,7 +53,7 @@ class Scanner extends PublicEmitter {
 	 * get all storages for $dir
 	 *
 	 * @param string $dir
-	 * @return \OC\Files\Mount\Mount[]
+	 * @return \OC\Files\Mount\MountPoint[]
 	 */
 	protected function getMounts($dir) {
 		//TODO: move to the node based fileapi once that's done
@@ -72,7 +72,7 @@ class Scanner extends PublicEmitter {
 	/**
 	 * attach listeners to the scanner
 	 *
-	 * @param \OC\Files\Mount\Mount $mount
+	 * @param \OC\Files\Mount\MountPoint $mount
 	 */
 	protected function attachListener($mount) {
 		$scanner = $mount->getStorage()->getScanner();
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 331ab9ba6cd5589316b6304e1bd4311784173123..4b3d167f8e9deab08524b89c5fbc5fcaef1b900c 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -465,7 +465,7 @@ class View {
 				if ($internalPath1 === '' and $mount instanceof MoveableMount) {
 					if ($this->isTargetAllowed($absolutePath2)) {
 						/**
-						 * @var \OC\Files\Mount\Mount | \OC\Files\Mount\MoveableMount $mount
+						 * @var \OC\Files\Mount\MountPoint | \OC\Files\Mount\MoveableMount $mount
 						 */
 						$sourceMountPoint = $mount->getMountPoint();
 						$result = $mount->moveMount($absolutePath2);
@@ -1227,7 +1227,7 @@ class View {
 		$mounts = array_reverse($mounts);
 		foreach ($mounts as $mount) {
 			/**
-			 * @var \OC\Files\Mount\Mount $mount
+			 * @var \OC\Files\Mount\MountPoint $mount
 			 */
 			if ($mount->getStorage()) {
 				$cache = $mount->getStorage()->getCache();
diff --git a/lib/private/server.php b/lib/private/server.php
index a08014fa6fab52a8723461f8af9aabc98e0f8243..9dc8a32b7378caf70a392f6b53a6daa185f28680 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -9,6 +9,7 @@ use OC\Cache\UserCache;
 use OC\Diagnostics\NullQueryLogger;
 use OC\Diagnostics\EventLogger;
 use OC\Diagnostics\QueryLogger;
+use OC\Files\Config\StorageManager;
 use OC\Security\CertificateManager;
 use OC\DB\ConnectionWrapper;
 use OC\Files\Node\Root;
@@ -268,6 +269,10 @@ class Server extends SimpleContainer implements IServerContainer {
 			$groupManager = $c->getGroupManager();
 			return new \OC\App\AppManager($userSession, $appConfig, $groupManager);
 		});
+		$this->registerService('MountConfigManager', function () {
+			$loader = \OC\Files\Filesystem::getLoader();
+			return new \OC\Files\Config\MountProviderCollection($loader);
+		});
 	}
 
 	/**
@@ -665,4 +670,11 @@ class Server extends SimpleContainer implements IServerContainer {
 	function getWebRoot() {
 		return $this->webRoot;
 	}
+
+	/**
+	 * @return \OCP\Files\Config\IMountProviderCollection
+	 */
+	function getMountProviderCollection(){
+		return $this->query('MountConfigManager');
+	}
 }
diff --git a/lib/public/files/config/imountprovider.php b/lib/public/files/config/imountprovider.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a39e6c89488747f80a1c9937f7d5d76f853efb4
--- /dev/null
+++ b/lib/public/files/config/imountprovider.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright (c) 2014 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 OCP\Files\Config;
+
+use OCP\Files\Storage\IStorageFactory;
+use OCP\IUser;
+
+/**
+ * Provides
+ */
+interface IMountProvider {
+	/**
+	 * Get all mountpoints applicable for the user
+	 *
+	 * @param \OCP\IUser $user
+	 * @param \OCP\Files\Storage\IStorageFactory $loader
+	 * @return \OCP\Files\Mount\IMountPoint[]
+	 */
+	public function getMountsForUser(IUser $user, IStorageFactory $loader);
+}
diff --git a/lib/public/files/config/imountprovidercollection.php b/lib/public/files/config/imountprovidercollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..52797414ab9bbeedc4df443a8aa85e88a6cae816
--- /dev/null
+++ b/lib/public/files/config/imountprovidercollection.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Copyright (c) 2014 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 OCP\Files\Config;
+
+use OCP\IUser;
+
+/**
+ * Manages the different mount providers
+ */
+interface IMountProviderCollection {
+	/**
+	 * Get all configured mount points for the user
+	 *
+	 * @param \OCP\IUser $user
+	 * @return \OCP\Files\Mount\IMountPoint[]
+	 */
+	public function getMountsForUser(IUser $user);
+
+	/**
+	 * Add a provider for mount points
+	 *
+	 * @param \OCP\Files\Config\IMountProvider $provider
+	 */
+	public function registerProvider(IMountProvider $provider);
+}
diff --git a/lib/public/files/mount/imountpoint.php b/lib/public/files/mount/imountpoint.php
new file mode 100644
index 0000000000000000000000000000000000000000..dac634bae4cbb64842dfa80089fe18bd746b234d
--- /dev/null
+++ b/lib/public/files/mount/imountpoint.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright (c) 2014 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 OCP\Files\Mount;
+
+/**
+ * A storage mounted to folder on the filesystem
+ */
+interface IMountPoint {
+
+	/**
+	 * get complete path to the mount point
+	 *
+	 * @return string
+	 */
+	public function getMountPoint();
+
+	/**
+	 * Set the mountpoint
+	 *
+	 * @param string $mountPoint new mount point
+	 */
+	public function setMountPoint($mountPoint);
+
+	/**
+	 * Get the storage that is mounted
+	 *
+	 * @return \OC\Files\Storage\Storage
+	 */
+	public function getStorage();
+
+	/**
+	 * Get the id of the storages
+	 *
+	 * @return string
+	 */
+	public function getStorageId();
+
+	/**
+	 * Get the path relative to the mountpoint
+	 *
+	 * @param string $path absolute path to a file or folder
+	 * @return string
+	 */
+	public function getInternalPath($path);
+
+	/**
+	 * Apply a storage wrapper to the mounted storage
+	 *
+	 * @param callable $wrapper
+	 */
+	public function wrapStorage($wrapper);
+}
diff --git a/lib/public/files/storage/istoragefactory.php b/lib/public/files/storage/istoragefactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..769d7011de4bb7e033a8a0ab156759b0a8b4147b
--- /dev/null
+++ b/lib/public/files/storage/istoragefactory.php
@@ -0,0 +1,32 @@
+<?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 OCP\Files\Storage;
+
+/**
+ * Creates storage instances and manages and applies storage wrappers
+ */
+interface IStorageFactory {
+	/**
+	 * allow modifier storage behaviour by adding wrappers around storages
+	 *
+	 * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage
+	 *
+	 * @param string $wrapperName
+	 * @param callable $callback
+	 */
+	public function addStorageWrapper($wrapperName, $callback);
+
+	/**
+	 * @param string|boolean $mountPoint
+	 * @param string $class
+	 * @param array $arguments
+	 * @return \OCP\Files\Storage
+	 */
+	public function getInstance($mountPoint, $class, $arguments);
+}
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
index 301f47c68fac1479ea267423683b2a37b58fd81c..657c9be423bf4cd4ba02e5df5caffc74ffb96af2 100644
--- a/lib/public/iservercontainer.php
+++ b/lib/public/iservercontainer.php
@@ -305,4 +305,9 @@ interface IServerContainer {
 	 * @return string
 	 */
 	function getWebRoot();
+
+	/**
+	 * @return \OCP\Files\Config\IMountProviderCollection
+	 */
+	function getMountProviderCollection();
 }
diff --git a/tests/lib/files/mount/manager.php b/tests/lib/files/mount/manager.php
index 051b76ccf2ea5a1e8b8c7a7909dc5b111b997ca7..78322b47d5017089044f04266c8970c33c1a7e46 100644
--- a/tests/lib/files/mount/manager.php
+++ b/tests/lib/files/mount/manager.php
@@ -30,33 +30,33 @@ class Manager extends \Test\TestCase {
 	public function testFind() {
 		$this->assertNull($this->manager->find('/'));
 
-		$rootMount = new \OC\Files\Mount\Mount(new Temporary(array()), '/');
+		$rootMount = new \OC\Files\Mount\MountPoint(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');
+		$mount1 = new \OC\Files\Mount\MountPoint($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');
+		$mount2 = new \OC\Files\Mount\MountPoint(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');
+		$mount3 = new \OC\Files\Mount\MountPoint($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');
+		$mount = new \OC\Files\Mount\MountPoint($storage, '/foo');
 		$this->manager->addMount($mount);
 
 		$id = $mount->getStorageId();
diff --git a/tests/lib/files/mount/mount.php b/tests/lib/files/mount/mount.php
index 5ee3d934e97b6bc4723edb3c2ad470853ae760c4..584766de8362984e9340609b691a5b80685931e1 100644
--- a/tests/lib/files/mount/mount.php
+++ b/tests/lib/files/mount/mount.php
@@ -9,7 +9,7 @@
 namespace Test\Files\Mount;
 
 
-use OC\Files\Storage\Loader;
+use OC\Files\Storage\StorageFactory;
 use OC\Files\Storage\Wrapper\Wrapper;
 
 class Mount extends \Test\TestCase {
@@ -17,12 +17,12 @@ class Mount extends \Test\TestCase {
 		$storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
 			->disableOriginalConstructor()
 			->getMock();
-		$mount = new \OC\Files\Mount\Mount($storage, '/foo');
+		$mount = new \OC\Files\Mount\MountPoint($storage, '/foo');
 		$this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage());
 	}
 
 	public function testFromStorageClassname() {
-		$mount = new \OC\Files\Mount\Mount('\OC\Files\Storage\Temporary', '/foo');
+		$mount = new \OC\Files\Mount\MountPoint('\OC\Files\Storage\Temporary', '/foo');
 		$this->assertInstanceOf('\OC\Files\Storage\Temporary', $mount->getStorage());
 	}
 
@@ -34,13 +34,13 @@ class Mount extends \Test\TestCase {
 			return new Wrapper(array('storage' => $storage));
 		};
 
-		$loader = new Loader();
+		$loader = new StorageFactory();
 		$loader->addStorageWrapper('test_wrapper', $wrapper);
 
 		$storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
 			->disableOriginalConstructor()
 			->getMock();
-		$mount = new \OC\Files\Mount\Mount($storage, '/foo', array(), $loader);
+		$mount = new \OC\Files\Mount\MountPoint($storage, '/foo', array(), $loader);
 		$this->assertInstanceOf('\OC\Files\Storage\Wrapper\Wrapper', $mount->getStorage());
 	}
 }
diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php
index 4aa57aa937393195e9b7b2f1b3704110fe487bd7..d8c047a2b757a35f99136a51116736346014a633 100644
--- a/tests/lib/files/node/folder.php
+++ b/tests/lib/files/node/folder.php
@@ -10,7 +10,7 @@ namespace Test\Files\Node;
 
 use OC\Files\Cache\Cache;
 use OC\Files\FileInfo;
-use OC\Files\Mount\Mount;
+use OC\Files\Mount\MountPoint;
 use OC\Files\Node\Node;
 use OCP\Files\NotFoundException;
 use OCP\Files\NotPermittedException;
@@ -419,7 +419,7 @@ class Folder extends \Test\TestCase {
 		$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
 		$subCache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
 		$subStorage = $this->getMock('\OC\Files\Storage\Storage');
-		$subMount = $this->getMock('\OC\Files\Mount\Mount', array(), array(null, ''));
+		$subMount = $this->getMock('\OC\Files\Mount\MountPoint', array(), array(null, ''));
 
 		$subMount->expects($this->once())
 			->method('getStorage')
@@ -487,7 +487,7 @@ class Folder extends \Test\TestCase {
 			->method('getUser')
 			->will($this->returnValue($this->user));
 		$storage = $this->getMock('\OC\Files\Storage\Storage');
-		$mount = new Mount($storage, '/bar');
+		$mount = new MountPoint($storage, '/bar');
 		$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
 
 		$view->expects($this->once())
@@ -530,7 +530,7 @@ class Folder extends \Test\TestCase {
 			->method('getUser')
 			->will($this->returnValue($this->user));
 		$storage = $this->getMock('\OC\Files\Storage\Storage');
-		$mount = new Mount($storage, '/bar');
+		$mount = new MountPoint($storage, '/bar');
 		$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
 
 		$storage->expects($this->once())
@@ -568,8 +568,8 @@ class Folder extends \Test\TestCase {
 			->method('getUser')
 			->will($this->returnValue($this->user));
 		$storage = $this->getMock('\OC\Files\Storage\Storage');
-		$mount1 = new Mount($storage, '/bar');
-		$mount2 = new Mount($storage, '/bar/foo/asd');
+		$mount1 = new MountPoint($storage, '/bar');
+		$mount2 = new MountPoint($storage, '/bar/foo/asd');
 		$cache = $this->getMock('\OC\Files\Cache\Cache', array(), array(''));
 
 		$view->expects($this->any())
diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php
index f729be81bd7d4f404785e177a24f15dc314910eb..65ddfe47514cca9a9880189644f86b1149c7f9d1 100644
--- a/tests/lib/files/utils/scanner.php
+++ b/tests/lib/files/utils/scanner.php
@@ -9,17 +9,17 @@
 namespace Test\Files\Utils;
 
 use OC\Files\Filesystem;
-use OC\Files\Mount\Mount;
+use OC\Files\Mount\MountPoint;
 use OC\Files\Storage\Temporary;
 
 class TestScanner extends \OC\Files\Utils\Scanner {
 	/**
-	 * @var \OC\Files\Mount\Mount[] $mounts
+	 * @var \OC\Files\Mount\MountPoint[] $mounts
 	 */
 	private $mounts = array();
 
 	/**
-	 * @param \OC\Files\Mount\Mount $mount
+	 * @param \OC\Files\Mount\MountPoint $mount
 	 */
 	public function addMount($mount) {
 		$this->mounts[] = $mount;
@@ -56,7 +56,7 @@ class Scanner extends \Test\TestCase {
 
 	public function testReuseExistingRoot() {
 		$storage = new Temporary(array());
-		$mount = new Mount($storage, '');
+		$mount = new MountPoint($storage, '');
 		Filesystem::getMountManager()->addMount($mount);
 		$cache = $storage->getCache();
 
@@ -78,7 +78,7 @@ class Scanner extends \Test\TestCase {
 
 	public function testReuseExistingFile() {
 		$storage = new Temporary(array());
-		$mount = new Mount($storage, '');
+		$mount = new MountPoint($storage, '');
 		Filesystem::getMountManager()->addMount($mount);
 		$cache = $storage->getCache();
 
@@ -105,7 +105,7 @@ class Scanner extends \Test\TestCase {
 		$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
 
 		$storage = new Temporary(array());
-		$mount = new Mount($storage, '/foo');
+		$mount = new MountPoint($storage, '/foo');
 		Filesystem::getMountManager()->addMount($mount);
 		$cache = $storage->getCache();