diff --git a/lib/base.php b/lib/base.php
index af860027c1d37dce4c0bcb321c584d7d1667409d..d3f3c5ba1c6b0a6e2e3191f458e97b0019924804 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -346,8 +346,9 @@ class OC{
 			}
 		}
 
-		// register cache cleanup
+		// register cache cleanup jobs
 		OC_BackgroundJob_RegularTask::register('OC_Cache_FileGlobal', 'gc');
+		OC_Hook::connect('OC_User', 'post_login', 'OC_Cache_File', 'loginListener');
 
 		// Check for blacklisted files
 		OC_Hook::connect('OC_Filesystem','write','OC_Filesystem','isBlacklisted');
diff --git a/lib/cache/file.php b/lib/cache/file.php
index 562c3d1716780f162f8be62492c6aaca8bf92acc..7298ba9074cd49b43eec21b95801096c90f53c2b 100644
--- a/lib/cache/file.php
+++ b/lib/cache/file.php
@@ -74,4 +74,25 @@ class OC_Cache_File{
 		}
 		return true;
 	}
+
+	public function gc() {
+		$storage = $this->getStorage();
+		if($storage and $storage->is_dir('/')) {
+			$now = time();
+			$dh=$storage->opendir('/');
+			while($file=readdir($dh)) {
+				if($file!='.' and $file!='..') {
+					$mtime = $storage->filemtime('/'.$file);
+					if ($mtime < $now) {
+						$storage->unlink('/'.$file);
+					}
+				}
+			}
+		}
+	}
+
+	public static function loginListener() {
+		$c = new self();
+		$c->gc();
+	}
 }