diff --git a/lib/autoloader.php b/lib/autoloader.php
index 21170639092029561eefb9e9aa0212d5202bb09d..01841f831becb72a546c8787ce2400cc9d9c2b2f 100644
--- a/lib/autoloader.php
+++ b/lib/autoloader.php
@@ -111,15 +111,39 @@ class Autoloader {
 	 * @param string $class
 	 * @return bool
 	 */
+	protected $memoryCache = null;
+	protected $constructingMemoryCache = true; // hack to prevent recursion
 	public function load($class) {
-		$paths = $this->findClass($class);
+		// Does this PHP have an in-memory cache? We cache the paths there
+		if ($this->constructingMemoryCache && !$this->memoryCache) {
+			$this->constructingMemoryCache = false;
+			$this->memoryCache = \OC\Memcache\Factory::createLowLatency('Autoloader');
+		}
+		if ($this->memoryCache) {
+			$pathsToRequire = $this->memoryCache->get($class);
+			if (is_array($pathsToRequire)) {
+				foreach ($pathsToRequire as $path) {
+					require_once $path;
+				}
+				return false;
+			}
+		}
 
+		// Use the normal class loading path
+		$paths = $this->findClass($class);
 		if (is_array($paths)) {
+			$pathsToRequire = array();
 			foreach ($paths as $path) {
 				if ($fullPath = stream_resolve_include_path($path)) {
 					require_once $fullPath;
+					$pathsToRequire[] = $fullPath;
 				}
 			}
+
+			// Save in our memory cache
+			if ($this->memoryCache) {
+				$this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec
+			}
 		}
 		return false;
 	}
diff --git a/lib/memcache/factory.php b/lib/memcache/factory.php
index 4c1b1ab207f228cbb5bb7a1774d2820733b0c6ad..fde7d94756731662ef562099ecbd6bc6836c5b04 100644
--- a/lib/memcache/factory.php
+++ b/lib/memcache/factory.php
@@ -37,4 +37,33 @@ class Factory {
 	public function isAvailable() {
 		return XCache::isAvailable() || APCu::isAvailable() || APC::isAvailable() || Memcached::isAvailable();
 	}
+
+	/**
+	 * get a in-server cache instance, will return null if no backend is available
+	 *
+	 * @param string $prefix
+	 * @return \OC\Memcache\Cache
+	 */
+	public static function createLowLatency($prefix = '') {
+		if (XCache::isAvailable()) {
+			return new XCache($prefix);
+		} elseif (APCu::isAvailable()) {
+			return new APCu($prefix);
+		} elseif (APC::isAvailable()) {
+			return new APC($prefix);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * check if there is a in-server backend available
+	 *
+	 * @return bool
+	 */
+	public static function isAvailableLowLatency() {
+		return XCache::isAvailable() || APCu::isAvailable() || APC::isAvailable();
+	}
+
+
 }