diff --git a/apps/files/index.php b/apps/files/index.php
index 2ce8fdb065f625531497062080c596df0f160214..dd63f29bc28aaf28249dab4c5b8fa879b42baf3a 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -101,6 +101,8 @@ if ($needUpgrade) {
 } else {
 	// information about storage capacities
 	$storageInfo=OC_Helper::getStorageInfo($dir);
+	$freeSpace=$storageInfo['free'];
+	$uploadLimit=OCP\Util::uploadLimit();
 	$maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
 	$publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
 	// if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
@@ -132,8 +134,10 @@ if ($needUpgrade) {
 	$tmpl->assign('files', $files);
 	$tmpl->assign('trash', $trashEnabled);
 	$tmpl->assign('trashEmpty', $trashEmpty);
-	$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
+	$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); // minimium of freeSpace and uploadLimit
 	$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
+	$tmpl->assign('freeSpace', $freeSpace);
+	$tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
 	$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
 	$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
 	$tmpl->assign('isPublic', false);
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 486273a910cf481f34bcc1eccfbca36b364a4d33..149e4a9666ba8cfbf180207ffa72001c63a8bf5e 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -241,10 +241,22 @@ $(document).ready(function() {
 				// add size
 				selection.totalBytes += file.size;
 			
-				//check max upload size
-				if (selection.totalBytes > $('#max_upload').val()) {
+				// check PHP upload limit
+				if (selection.totalBytes > $('#upload_limit').val()) {
+					data.textStatus = 'sizeexceedlimit';
+					data.errorThrown = t('files', 'Total file size {size1} exceeds upload limit {size2}', {
+						'size1': humanFileSize(selection.totalBytes),
+						'size2': humanFileSize($('#upload_limit').val())
+					});
+				}
+
+				// check free space
+				if (selection.totalBytes > $('#free_space').val()) {
 					data.textStatus = 'notenoughspace';
-					data.errorThrown = t('files', 'Not enough space available');
+					data.errorThrown = t('files', 'Not enough free space, you are uploading {size1} but only {size2} is left', {
+						'size1': humanFileSize(selection.totalBytes),
+						'size2': humanFileSize($('#free_space').val())
+					});
 				}
 			
 				// end upload for whole selection on error
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index d794a1584de685f9fcd0b0ded95addc276bc0173..06f37da4b5ca96f44fc2ebdb981d542cbfab7c84 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -41,6 +41,7 @@ Files={
 		}
 		if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) {
 			$('#max_upload').val(response.data.uploadMaxFilesize);
+			$('#free_space').val(response.data.freeSpace);
 			$('#upload.button').attr('original-title', response.data.maxHumanFilesize);
 			$('#usedSpacePercent').val(response.data.usedSpacePercent);
 			Files.displayStorageWarnings();
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index eaff28178eaf1341c8e8abf587af6a320eb5887a..21d1f50e5873b69c1fab71477f381865ffda9b5f 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -15,6 +15,7 @@ class Helper
 
 		return array('uploadMaxFilesize' => $maxUploadFilesize,
 					 'maxHumanFilesize'  => $maxHumanFilesize,
+					 'freeSpace' => $storageInfo['free'],
 					 'usedSpacePercent'  => (int)$storageInfo['relative']);
 	}
 
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index ff78f0ca551871437fc12dffffca8dd6ac30a243..939043b2c9f78ccce5f13df392c364311a8b7d08 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -17,9 +17,10 @@
 			<div id="upload" class="button"
 				 title="<?php p($l->t('Upload') . ' max. '.$_['uploadMaxHumanFilesize']) ?>">
 					<?php if($_['uploadMaxFilesize'] >= 0):?>
-					<input type="hidden" name="MAX_FILE_SIZE" id="max_upload"
-						   value="<?php p($_['uploadMaxFilesize']) ?>">
+					<input type="hidden" id="max_upload" name="MAX_FILE_SIZE" value="<?php p($_['uploadMaxFilesize']) ?>">
 					<?php endif;?>
+					<input type="hidden" id="upload_limit" value="<?php p($_['uploadLimit']) ?>">
+					<input type="hidden" id="free_space" value="<?php p($_['freeSpace']) ?>">
 					<?php if(isset($_['dirToken'])):?>
 					<input type="hidden" id="publicUploadRequestToken" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
 					<input type="hidden" id="dirToken" name="dirToken" value="<?php p($_['dirToken']) ?>" />
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index 0ca923fff080cad75c190db197071d8d827a50b0..b187da41324eb31a4f715ce292dcc160fec097be 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -143,6 +143,8 @@ if (isset($path)) {
 		OCP\Util::addScript('files', 'jquery.iframe-transport');
 		OCP\Util::addScript('files', 'jquery.fileupload');
 		$maxUploadFilesize=OCP\Util::maxUploadFilesize($path);
+		$freeSpace=OCP\Util::freeSpace($dir);
+		$uploadLimit=OCP\Util::uploadLimit();
 		$tmpl = new OCP\Template('files_sharing', 'public', 'base');
 		$tmpl->assign('uidOwner', $shareOwner);
 		$tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner));
@@ -162,6 +164,8 @@ if (isset($path)) {
 		}
 		$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
 		$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
+		$tmpl->assign('freeSpace', $freeSpace);
+		$tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
 
 		$urlLinkIdentifiers= (isset($token)?'&t='.$token:'')
 							.(isset($_GET['dir'])?'&dir='.$_GET['dir']:'')
diff --git a/lib/private/helper.php b/lib/private/helper.php
index ce5708e2bb92054e01c3a657dec6f131e6580cb7..580f81acc6259c7287cf4e0d3751930544ee93d8 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -808,23 +808,39 @@ class OC_Helper {
 	 * @return number of bytes representing
 	 */
 	public static function maxUploadFilesize($dir) {
-		$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize'));
-		$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size'));
-		$freeSpace = \OC\Files\Filesystem::free_space($dir);
-		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
-			$maxUploadFilesize = \OC\Files\SPACE_UNLIMITED;
-		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
-			$maxUploadFilesize = max($upload_max_filesize, $post_max_size); //only the non 0 value counts
-		} else {
-			$maxUploadFilesize = min($upload_max_filesize, $post_max_size);
-		}
+		return min(self::freeSpace($dir), self::uploadLimit());
+	}
 
+	/**
+	 * Calculate free space left within user quota
+	 * 
+	 * @param $dir the current folder where the user currently operates
+	 * @return number of bytes representing
+	 */
+	public static function freeSpace($dir) {
+		$freeSpace = \OC\Files\Filesystem::free_space($dir);
 		if ($freeSpace !== \OC\Files\SPACE_UNKNOWN) {
 			$freeSpace = max($freeSpace, 0);
+			return $freeSpace;
+		} else {
+			return INF;
+		}
+	}
 
-			return min($maxUploadFilesize, $freeSpace);
+	/**
+	 * Calculate PHP upload limit
+	 *
+	 * @return PHP upload file size limit
+	 */
+	public static function uploadLimit() {
+		$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize'));
+		$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size'));
+		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
+			return INF;
+		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
+			return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
 		} else {
-			return $maxUploadFilesize;
+			return min($upload_max_filesize, $post_max_size);
 		}
 	}
 
diff --git a/lib/public/util.php b/lib/public/util.php
index 26c5a15cff2fd27c20c7140690c1726b1064be6d..d8497e29cfc076c4d3eab6cc99dc13ef8c2c9ee1 100644
--- a/lib/public/util.php
+++ b/lib/public/util.php
@@ -466,4 +466,23 @@ class Util {
 	public static function maxUploadFilesize($dir) {
 		return \OC_Helper::maxUploadFilesize($dir);
 	}
+
+	/**
+	 * Calculate free space left within user quota
+	 * 
+	 * @param $dir the current folder where the user currently operates
+	 * @return number of bytes representing
+	 */
+	public static function freeSpace($dir) {
+		return \OC_Helper::freeSpace($dir);
+	}
+
+	/**
+	 * Calculate PHP upload limit
+	 *
+	 * @return number of bytes representing
+	 */
+	public static function uploadLimit() {
+		return \OC_Helper::uploadLimit();
+	}
 }