diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php
index ec5b716fb2a0bdfd72e28a60ecc24e42e4e1e1c4..1853098c5072cd06b9d158f41c178356b7d6a851 100644
--- a/apps/files/ajax/newfile.php
+++ b/apps/files/ajax/newfile.php
@@ -64,6 +64,15 @@ if(strpos($filename, '/') !== false) {
 	exit();
 }
 
+if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
+	$result['data'] = array('message' => (string)$l10n->t(
+			'The target folder has been moved or deleted.'),
+			'code' => 'targetnotfound'
+		);
+	OCP\JSON::error($result);
+	exit();
+}
+
 //TODO why is stripslashes used on foldername in newfolder.php but not here?
 $target = $dir.'/'.$filename;
 
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
index 2cbc8cfeba5ee25bfce6d0fb92f6ea809356609f..4cfcae3090d58da8ad3201480d95278c30851a97 100644
--- a/apps/files/ajax/newfolder.php
+++ b/apps/files/ajax/newfolder.php
@@ -29,6 +29,15 @@ if(strpos($foldername, '/') !== false) {
 	exit();
 }
 
+if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
+	$result['data'] = array('message' => (string)$l10n->t(
+			'The target folder has been moved or deleted.'),
+			'code' => 'targetnotfound'
+		);
+	OCP\JSON::error($result);
+	exit();
+}
+
 //TODO why is stripslashes used on foldername here but not in newfile.php?
 $target = $dir . '/' . stripslashes($foldername);
 		
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index bdaf6a77d1434fcadfb8b2fdff2726eb1116b40f..8f6c42d6620b49a7718c07085038b8e81cf4d69d 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -8,6 +8,7 @@ OCP\JSON::setContentTypeHeader('text/plain');
 // If no token is sent along, rely on login only
 
 $allowedPermissions = OCP\PERMISSION_ALL;
+$errorCode = null;
 
 $l = OC_L10N::get('files');
 if (empty($_POST['dirToken'])) {
@@ -125,7 +126,8 @@ if (strpos($dir, '..') === false) {
 
 					$meta = \OC\Files\Filesystem::getFileInfo($target);
 					if ($meta === false) {
-						$error = $l->t('Upload failed. Could not get file info.');
+						$error = $l->t('The target folder has been moved or deleted.');
+						$errorCode = 'targetnotfound';
 					} else {
 						$result[] = array('status' => 'success',
 							'mime' => $meta['mimetype'],
@@ -177,5 +179,5 @@ if ($error === false) {
 	OCP\JSON::encodedPrint($result);
 	exit();
 } else {
-	OCP\JSON::error(array(array('data' => array_merge(array('message' => $error), $storageStats))));
+	OCP\JSON::error(array(array('data' => array_merge(array('message' => $error, 'code' => $errorCode), $storageStats))));
 }
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 225c3319107dd2e1a27fab4a9177202c4fee99c8..486273a910cf481f34bcc1eccfbca36b364a4d33 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -315,6 +315,13 @@ $(document).ready(function() {
 					} else {
 						// HTTP connection problem
 						OC.Notification.show(data.errorThrown);
+						if (data.result) {
+							var result = JSON.parse(data.result);
+							if (result && result[0] && result[0].data && result[0].data.code === 'targetnotfound') {
+								// abort upload of next files if any
+								OC.Upload.cancelUploads();
+							}
+						}
 					}
 					//hide notification after 10 sec
 					setTimeout(function() {
diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php
index 1ac266073db001f3209b4b36a45fe99b2d9bfece..fea88faa92a872cb17b8757b8d2e952004f246f7 100644
--- a/apps/files/lib/app.php
+++ b/apps/files/lib/app.php
@@ -59,6 +59,13 @@ class App {
 			$result['data'] = array(
 				'message'	=> $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved.")
 			);
+		// rename to non-existing folder is denied
+		} else if (!$this->view->file_exists($dir)) {
+			$result['data'] = array('message' => (string)$this->l10n->t(
+					'The target folder has been moved or deleted.',
+					array($dir)),
+					'code' => 'targetnotfound'
+				);
 		// rename to existing file is denied
 		} else if ($this->view->file_exists($dir . '/' . $newname)) {
 			
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
index 350ff5d36871072d86521501a0a337d0c19e4296..a1a5c8983ba3d304a163776020c02c364dad7d70 100644
--- a/apps/files/tests/ajax_rename.php
+++ b/apps/files/tests/ajax_rename.php
@@ -38,7 +38,7 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 		$l10nMock->expects($this->any())
 			->method('t')
 			->will($this->returnArgument(0));
-		$viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo'), array(), '', false);
+		$viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo', 'file_exists'), array(), '', false);
 		$viewMock->expects($this->any())
 			->method('normalizePath')
 			->will($this->returnArgument(0));
@@ -63,6 +63,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 		$oldname = 'Shared';
 		$newname = 'new_name';
 
+		$this->viewMock->expects($this->at(0))
+			->method('file_exists')
+			->with('/')
+			->will($this->returnValue(true));
+
 		$result = $this->files->rename($dir, $oldname, $newname);
 		$expected = array(
 			'success'	=> false,
@@ -80,6 +85,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 		$oldname = 'Shared';
 		$newname = 'new_name';
 
+		$this->viewMock->expects($this->at(0))
+			->method('file_exists')
+			->with('/test')
+			->will($this->returnValue(true));
+
 		$this->viewMock->expects($this->any())
 			->method('getFileInfo')
 			->will($this->returnValue(array(
@@ -129,6 +139,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 		$oldname = 'oldname';
 		$newname = 'newname';
 
+		$this->viewMock->expects($this->at(0))
+			->method('file_exists')
+			->with('/')
+			->will($this->returnValue(true));
+
 		$this->viewMock->expects($this->any())
 			->method('getFileInfo')
 			->will($this->returnValue(array(
@@ -141,7 +156,6 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 				'name' => 'new_name',
 			)));
 
-
 		$result = $this->files->rename($dir, $oldname, $newname);
 
 		$this->assertTrue($result['success']);
@@ -154,4 +168,35 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
 		$this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']);
 		$this->assertFalse($result['data']['isPreviewAvailable']);
 	}
+
+	/**
+	 * Test rename inside a folder that doesn't exist any more
+	 */
+	function testRenameInNonExistingFolder() {
+		$dir = '/unexist';
+		$oldname = 'oldname';
+		$newname = 'newname';
+
+		$this->viewMock->expects($this->at(0))
+			->method('file_exists')
+			->with('/unexist')
+			->will($this->returnValue(false));
+
+		$this->viewMock->expects($this->any())
+			->method('getFileInfo')
+			->will($this->returnValue(array(
+				'fileid' => 123,
+				'type' => 'dir',
+				'mimetype' => 'httpd/unix-directory',
+				'size' => 18,
+				'etag' => 'abcdef',
+				'directory' => '/unexist',
+				'name' => 'new_name',
+			)));
+
+		$result = $this->files->rename($dir, $oldname, $newname);
+
+		$this->assertFalse($result['success']);
+		$this->assertEquals('targetnotfound', $result['data']['code']);
+	}
 }