diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index 07977f5ddf1ddb04972bd027b903429889dc04db..9031c729eff09408079469e502c32c903a254bd1 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -48,7 +48,7 @@ $totalSize = 0;
 foreach ($files['size'] as $size) {
 	$totalSize += $size;
 }
-if ($totalSize > \OC\Files\Filesystem::free_space($dir)) {
+if ($totalSize > $maxUploadFilesize) {
 	OCP\JSON::error(array('data' => array('message' => $l->t('Not enough storage available'),
 		'uploadMaxFilesize' => $maxUploadFilesize,
 		'maxHumanFilesize' => $maxHumanFilesize)));
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 494885a1dd3f3d1d69a097730d8fc1a3ab40885f..37e53a3a6701886a3d270bb731c6746262674d90 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -229,11 +229,6 @@ class AmazonS3 extends \OC\Files\Storage\Common {
 		return false;
 	}
 
-	public function free_space($path) {
-		// Infinite?
-		return false;
-	}
-
 	public function touch($path, $mtime = null) {
 		if (is_null($mtime)) {
 			$mtime = time();
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index 3527f50ec98ab05e6fc9117c7610068433b3dc5f..785eb7dfc424a5bb1d88dc44f27704863243aa63 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -242,10 +242,6 @@ class SFTP extends \OC\Files\Storage\Common {
 		}
 	}
 
-	public function free_space($path) {
-		return -1;
-	}
-
 	public function touch($path, $mtime=null) {
 		try {
 			if (!is_null($mtime)) return false;
diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php
index a631e7ce06aafbb1c7369135cbe42484b741c5b3..4685877f26b7ea0bb0d7266bfceb897afa08f809 100644
--- a/apps/files_external/lib/streamwrapper.php
+++ b/apps/files_external/lib/streamwrapper.php
@@ -76,10 +76,6 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
 		return fopen($this->constructUrl($path), $mode);
 	}
 
-	public function free_space($path) {
-		return 0;
-	}
-
 	public function touch($path, $mtime=null) {
 		$this->init();
 		if(is_null($mtime)) {
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
index 0fd6fa143b816dff602231767ae57fe7b2e51cd1..a00316c1f844a4ea8d6b17cc0423c366cce296f0 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/swift.php
@@ -478,10 +478,6 @@ class SWIFT extends \OC\Files\Storage\Common{
 		}
 	}
 
-	public function free_space($path) {
-		return 1024*1024*1024*8;
-	}
-
 	public function touch($path, $mtime=null) {
 		$this->init();
 		$obj=$this->getObject($path);
diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php
index 039a07b1ef2a9b4a9229ddc59fb9c61a12e1cd9a..91cc22779e69c67b368fc09878e87fb52dfb62fa 100644
--- a/apps/files_external/lib/webdav.php
+++ b/apps/files_external/lib/webdav.php
@@ -222,7 +222,7 @@ class DAV extends \OC\Files\Storage\Common{
 				return 0;
 			}
 		} catch(\Exception $e) {
-			return 0;
+			return \OC\Files\FREE_SPACE_UNKNOWN;
 		}
 	}
 
diff --git a/lib/fileproxy/quota.php b/lib/fileproxy/quota.php
index 07d1d250e4d033bfc1537e3b1b0a61b3bf9175b2..3dac3264fbec6f27db03836410907a8b6d0bad9b 100644
--- a/lib/fileproxy/quota.php
+++ b/lib/fileproxy/quota.php
@@ -62,21 +62,21 @@ class OC_FileProxy_Quota extends OC_FileProxy{
 		 * @var string $internalPath
 		 */
 		list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($path);
-		$owner=$storage->getOwner($internalPath);
+		$owner = $storage->getOwner($internalPath);
 		if (!$owner) {
 			return -1;
 		}
 
-		$totalSpace=$this->getQuota($owner);
-		if($totalSpace==-1) {
+		$totalSpace = $this->getQuota($owner);
+		if($totalSpace == -1) {
 			return -1;
 		}
 
 		$view = new \OC\Files\View("/".$owner."/files");
 
-		$rootInfo=$view->getFileInfo('/');
-		$usedSpace=isset($rootInfo['size'])?$rootInfo['size']:0;
-		return $totalSpace-$usedSpace;
+		$rootInfo = $view->getFileInfo('/');
+		$usedSpace = isset($rootInfo['size'])?$rootInfo['size']:0;
+		return $totalSpace - $usedSpace;
 	}
 
 	public function postFree_space($path, $space) {
@@ -84,6 +84,9 @@ class OC_FileProxy_Quota extends OC_FileProxy{
 		if($free==-1) {
 			return $space;
 		}
+		if ($space < 0){
+			return $free;
+		}
 		return min($free, $space);
 	}
 
diff --git a/lib/files/filesystem.php b/lib/files/filesystem.php
index cba469e06c4eda710fec917a165225c72963d291..875a9d6c5eea8df49bbade8cf6e682a52c707775 100644
--- a/lib/files/filesystem.php
+++ b/lib/files/filesystem.php
@@ -29,6 +29,8 @@
 
 namespace OC\Files;
 
+const FREE_SPACE_UNKNOWN = -2;
+
 class Filesystem {
 	public static $loaded = false;
 	/**
diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php
index 4cdabf1c8a6ebc59c908bbb8379b01250f2735b7..4e7a73e5d4acb0b55be1aae625023079adc7abd5 100644
--- a/lib/files/storage/common.php
+++ b/lib/files/storage/common.php
@@ -301,4 +301,13 @@ abstract class Common implements \OC\Files\Storage\Storage {
 		}
 		return implode('/', $output);
 	}
+
+	/**
+	 * get the free space in the storage
+	 * @param $path
+	 * return int
+	 */
+	public function free_space($path){
+		return \OC\Files\FREE_SPACE_UNKNOWN;
+	}
 }
diff --git a/lib/helper.php b/lib/helper.php
index 0f810ffc0c2dc885749a6992ad9eaf43f9006fa2..add5c66e7bee236c9f4546ffdc944172431bf192 100644
--- a/lib/helper.php
+++ b/lib/helper.php
@@ -762,9 +762,13 @@ class OC_Helper {
 		$maxUploadFilesize = min($upload_max_filesize, $post_max_size);
 
 		$freeSpace = \OC\Files\Filesystem::free_space($dir);
-		$freeSpace = max($freeSpace, 0);
+		if($freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN){
+			$freeSpace = max($freeSpace, 0);
 
-		return min($maxUploadFilesize, $freeSpace);
+			return min($maxUploadFilesize, $freeSpace);
+		} else {
+			return $maxUploadFilesize;
+		}
 	}
 
 	/**