diff --git a/apps/files_sharing/lib_share.php b/apps/files_sharing/lib_share.php
index f682e1a30f14f698ea6babb08b3ff9a4f389bd80..a4223a137d12f3492c5e8226ce0b84bce9c2df98 100644
--- a/apps/files_sharing/lib_share.php
+++ b/apps/files_sharing/lib_share.php
@@ -264,9 +264,9 @@ class OC_Share {
 		if (count($result) > 0) {
 			return $result[0]['permissions'];
 		} else {
-			$folders =self::getParentFolders($target);
+			$folders = self::getParentFolders($target);
 			if ($folders == true) {
-				$result = $query->execute(array($folders))->fetchAll();
+				$result = $query->execute(array($folders['target']))->fetchAll();
 				if (count($result) > 0) {
 					return $result[0]['permissions'];
 				}
diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php
index 271819782b708171133ec52a80ad77f19729db85..03385d649cb86bf5ba2ea3636cd67183b6131205 100644
--- a/apps/files_sharing/sharedstorage.php
+++ b/apps/files_sharing/sharedstorage.php
@@ -392,48 +392,36 @@ class OC_Filestorage_Shared extends OC_Filestorage {
 	}
 	
 	public function unlink($path) {
-		$target = $this->datadir.$path;
-		// If the user has delete permission for the item, the source item will be deleted
-		if (OC_Share::getPermissions($target) & OC_Share::DELETE) {
-			$source = $this->getSource($path);
-			if ($source) {
-				$storage = OC_Filesystem::getStorage($source);
-				return $storage->unlink($this->getInternalPath($source));
-			}
 		// The item will be removed from the database, but won't be touched on the owner's filesystem
-		} else {
-			// Check if the item is inside a shared folder
-			if (OC_Share::getParentFolders($target)) {
-				// If entry for item already exists
-				if (OC_Share::getItem($target)) {
-					OC_Share::setTarget($target, "/");
-				} else {
-					OC_Share::pullOutOfFolder($target, "/");
-				}
-			// Delete the database entry
+		$target = $this->datadir.$path;
+		// Check if the item is inside a shared folder
+		if (OC_Share::getParentFolders($target)) {
+			// If entry for item already exists
+			if (OC_Share::getItem($target)) {
+				OC_Share::setTarget($target, "/");
 			} else {
-				OC_Share::unshareFromMySelf($target);
+				OC_Share::pullOutOfFolder($target, "/");
 			}
-			$this->clearFolderSizeCache($this->getInternalPath($target));
+		// Delete the database entry
+		} else {
+			OC_Share::unshareFromMySelf($target);
 		}
+		$this->clearFolderSizeCache($this->getInternalPath($target));
 		return true;
 	}
 	
 	public function rename($path1, $path2) {
-		// If the user has write permission for the item, the source item will be renamed
-		if ($this->is_writeable($path1)) {
-			$source = $this->getSource($path1);
-			if ($source) {
-				$storage = OC_Filesystem::getStorage($source);
-				return $storage->rename($path1, $path2);
-			}
-		// The item will be renamed in the database, but won't be touched on the owner's filesystem
-		} else {
-			$oldTarget = $this->datadir.$path1;
-			$newTarget = $this->datadir.$path2;
-			if (OC_Share::getItem($oldTarget)) {
-				OC_Share::setTarget($oldTarget, $newTarget);
-			// There is no entry in the database for the item, it must be inside a shared folder
+		$oldTarget = $this->datadir.$path1;
+		$newTarget = $this->datadir.$path2;
+		// Check if the item is inside a shared folder
+		if (OC_Share::getParentFolders($oldTarget)) {
+			if ($this->is_writeable($path1)) {
+				$oldSource = $this->getSource($path1);
+				$newSource = dirname($oldSource)."/".basename($path2);
+				if ($oldSource) {
+					$storage = OC_Filesystem::getStorage($oldSource);
+					return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource));
+				}
 			} else {
 				OC_Share::pullOutOfFolder($oldTarget, $newTarget);
 				// If this is a folder being renamed, call setTarget in case there are any database entries inside the folder
@@ -441,10 +429,12 @@ class OC_Filestorage_Shared extends OC_Filestorage {
 					OC_Share::setTarget($oldTarget, $newTarget);
 				}
 			}
-			$this->clearFolderSizeCache($this->getInternalPath($oldTarget));
-			$this->clearFolderSizeCache($this->getInternalPath($newTarget));
-			return true;
+		} else {
+			OC_Share::setTarget($oldTarget, $newTarget);
 		}
+		$this->clearFolderSizeCache($this->getInternalPath($oldTarget));
+		$this->clearFolderSizeCache($this->getInternalPath($newTarget));
+		return true;
 	}
 	
 	public function copy($path1, $path2) {