diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 909baca92ea7457050d53f6a0a242719836742e9..15a29133789d33a82a3f687aba758d09884e1718 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -12,13 +12,6 @@ OCP\App::addNavigationEntry(array("id" => "files_index",
 
 OC_Search::registerProvider('OC_Search_Provider_File');
 
-// cache hooks must be connected before all other apps.
-// since 'files' is always loaded first the hooks need to be connected here
-\OC_Hook::connect('OC_Filesystem', 'post_write', '\OC\Files\Cache\Updater', 'writeHook');
-\OC_Hook::connect('OC_Filesystem', 'post_touch', '\OC\Files\Cache\Updater', 'touchHook');
-\OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Updater', 'deleteHook');
-\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook');
-
 \OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext');
 
 $templateManager = OC_Helper::getFileTemplateManager();
diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php
index 666d5dd7fe55405d2a20b6ce24a4b0d49ea0a4ef..199ce5dee78f158369d605c158cc184b34494dca 100644
--- a/lib/private/files/cache/updater.php
+++ b/lib/private/files/cache/updater.php
@@ -119,6 +119,9 @@ class Updater {
 
 		if ($uid != \OCP\User::getUser()) {
 			$info = \OC\Files\Filesystem::getFileInfo($filename);
+			if (!$info) {
+				return array($uid, '/files/' . $filename);
+			}
 			$ownerView = new \OC\Files\View('/' . $uid . '/files');
 			$filename = $ownerView->getPath($info['fileid']);
 		}
@@ -150,7 +153,7 @@ class Updater {
 				$cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath)));
 				if ($realPath !== '') {
 					$realPath = dirname($realPath);
-					if($realPath === DIRECTORY_SEPARATOR ) {
+					if ($realPath === DIRECTORY_SEPARATOR) {
 						$realPath = "";
 					}
 					// check storage for parent in case we change the storage in this step
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 2dbbf5b88c977169805c85d441d981a88aca157e..f06c2fcd66c463c54af5d1efa83326b5fdbd161e 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -25,6 +25,8 @@
 
 namespace OC\Files;
 
+use OC\Files\Cache\Updater;
+
 class View {
 	private $fakeRoot = '';
 	private $internal_path_cache = array();
@@ -308,6 +310,9 @@ class View {
 					fclose($target);
 					fclose($data);
 					if ($this->shouldEmitHooks($path) && $result !== false) {
+						Updater::writeHook(array(
+							'path' => $this->getHookPath($path)
+						));
 						if (!$exists) {
 							\OC_Hook::emit(
 								Filesystem::CLASSNAME,
@@ -433,6 +438,7 @@ class View {
 				}
 				if ($this->shouldEmitHooks() && (Cache\Scanner::isPartialFile($path1) && !Cache\Scanner::isPartialFile($path2)) && $result !== false) {
 					// if it was a rename from a part file to a regular file it was a write and not a rename operation
+					Updater::writeHook(array('path' => $this->getHookPath($path2)));
 					\OC_Hook::emit(
 						Filesystem::CLASSNAME,
 						Filesystem::signal_post_write,
@@ -441,6 +447,10 @@ class View {
 						)
 					);
 				} elseif ($this->shouldEmitHooks() && $result !== false) {
+					Updater::renameHook(array(
+						'oldpath' => $this->getHookPath($path1),
+						'newpath' => $this->getHookPath($path2)
+					));
 					\OC_Hook::emit(
 						Filesystem::CLASSNAME,
 						Filesystem::signal_post_rename,
@@ -741,7 +751,10 @@ class View {
 	}
 
 	/**
+	 * @param string[] $hooks
 	 * @param string $path
+	 * @param bool $post
+	 * @return bool
 	 */
 	private function runHooks($hooks, $path, $post = false) {
 		$path = $this->getHookPath($path);
@@ -749,6 +762,16 @@ class View {
 		$run = true;
 		if ($this->shouldEmitHooks($path)) {
 			foreach ($hooks as $hook) {
+				// manually triger updater hooks to ensure they are called first
+				if ($post) {
+					if ($hook == 'write') {
+						Updater::writeHook(array('path' => $path));
+					} elseif ($hook == 'touch') {
+						Updater::touchHook(array('path' => $path));
+					} else if ($hook == 'delete') {
+						Updater::deleteHook(array('path' => $path));
+					}
+				}
 				if ($hook != 'read') {
 					\OC_Hook::emit(
 						Filesystem::CLASSNAME,
@@ -820,7 +843,7 @@ class View {
 				$data = $cache->get($internalPath);
 			}
 
-			if ($data and $data['fileid']) {
+			if ($data and isset($data['fileid'])) {
 				if ($includeMountPoints and $data['mimetype'] === 'httpd/unix-directory') {
 					//add the sizes of other mountpoints to the folder
 					$mountPoints = Filesystem::getMountPoints($path);
diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php
index a6ee8c4666137121aed0622bd51e8fda168f01b6..e2fae0ae57f0aa0c838d25dc6a229b106db170b7 100644
--- a/tests/lib/files/cache/updater.php
+++ b/tests/lib/files/cache/updater.php
@@ -65,11 +65,6 @@ class Updater extends \PHPUnit_Framework_TestCase {
 		Filesystem::mount($this->storage, array(), '/' . self::$user . '/files');
 
 		\OC_Hook::clear('OC_Filesystem');
-
-		\OC_Hook::connect('OC_Filesystem', 'post_write', '\OC\Files\Cache\Updater', 'writeHook');
-		\OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Updater', 'deleteHook');
-		\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook');
-		\OC_Hook::connect('OC_Filesystem', 'post_touch', '\OC\Files\Cache\Updater', 'touchHook');
 	}
 
 	public function tearDown() {