diff --git a/apps/calendar/lib/sabre/object.php b/apps/calendar/lib/sabre/object.php
index 25954e6ee555828bfdbd5de4c42bf8341f928911..0d1bfa397c8028179359e8c193360a91f555542b 100644
--- a/apps/calendar/lib/sabre/object.php
+++ b/apps/calendar/lib/sabre/object.php
@@ -45,11 +45,11 @@ class OC_Connector_Sabre_CalDAV_CalendarObject extends Sabre_CalDAV_CalendarObje
 		$uid = OC_Calendar_Calendar::extractUserID($this->getOwner());
 
 		if($uid != OCP\USER::getUser()) {
-			$sharedAddressbook = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']);
-			if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) {
+			$sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']);
+			if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) {
 				$readprincipal = 'principals/' . OCP\USER::getUser();
 			}
-			if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) {
+			if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) {
 				$writeprincipal = 'principals/' . OCP\USER::getUser();
 			}
 		}
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 39e848cec8096a83bb842995dc4003ff71fcc255..89e7bdd7ad744987ce5e9e2840a9b6ff53df2969 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -77,6 +77,10 @@ FileActions={
 		parent.children('a.name').append('<span class="fileactions" />');
 		var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions());
 		for(name in actions){
+			// NOTE: Temporary fix to prevent rename action in root of Shared directory
+			if (name == 'Rename' && $('#dir').val() == '/Shared') {
+				continue;
+			}
 			if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){
 				var img=FileActions.icons[name];
 				if(img.call){
diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php
index 6667b5488af81a64d532f946496e0a515dd74917..8faeae3939cd14344879d6a804ea6f54ec34e4f6 100644
--- a/apps/files/templates/part.list.php
+++ b/apps/files/templates/part.list.php
@@ -9,7 +9,7 @@
 			$name = str_replace('%2F','/', $name);
 			$directory = str_replace('+','%20',urlencode($file['directory']));
 			$directory = str_replace('%2F','/', $directory); ?>
-			<tr data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>' data-permissions='<?php echo $file['permissions']; ?>'>
+			<tr data-id="<?php echo $file['id']; ?>" data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>' data-permissions='<?php echo $file['permissions']; ?>'>
 				<td class="filename svg" style="background-image:url(<?php if($file['type'] == 'dir') echo OCP\mimetype_icon('dir'); else echo OCP\mimetype_icon($file['mimetype']); ?>)">
 					<?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" /><?php } ?>
 					<a class="name" href="<?php if($file['type'] == 'dir') echo $_['baseURL'].$directory.'/'.$name; else echo $_['downloadURL'].$directory.'/'.$name; ?>" title="">
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index bcfd42ce21e821f583e64d343c5c0f39283229ff..8754b16b061328be05c66f4fbdc85ac98d463aa3 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -2,7 +2,7 @@ $(document).ready(function() {
 
 	if (typeof FileActions !== 'undefined') {
 		OC.Share.loadIcons('file');
-		FileActions.register('all', 'Share', FileActions.PERMISSION_SHARE, function(filename) {
+		FileActions.register('all', 'Share', FileActions.PERMISSION_READ, function(filename) {
 			// Return the correct sharing icon
 			if (scanFiles.scanning) { return; } // workaround to prevent additional http request block scanning feedback
 			if ($('#dir').val() == '/') {
@@ -36,27 +36,27 @@ $(document).ready(function() {
 			} else {
 				var item = $('#dir').val() + '/' + filename;
 			}
-			if ($('tr').filterAttr('data-file', filename).data('type') == 'dir') {
+			var tr = $('tr').filterAttr('data-file', filename);
+			if ($(tr).data('type') == 'dir') {
 				var itemType = 'folder';
-				var possiblePermissions = OC.Share.PERMISSION_CREATE | OC.Share.PERMISSION_UPDATE | OC.Share.PERMISSION_DELETE | OC.Share.PERMISSION_SHARE;
 			} else {
 				var itemType = 'file';
-				var possiblePermissions = OC.Share.PERMISSION_UPDATE | OC.Share.PERMISSION_DELETE | OC.Share.PERMISSION_SHARE;
 			}
-			var appendTo = $('tr').filterAttr('data-file', filename).find('td.filename');
+			var possiblePermissions = $(tr).data('permissions');
+			var appendTo = $(tr).find('td.filename');
 			// Check if drop down is already visible for a different file
 			if (OC.Share.droppedDown) {
 				if (item != $('#dropdown').data('item')) {
 					OC.Share.hideDropDown(function () {
-						$('tr').filterAttr('data-file', filename).addClass('mouseOver');
-						OC.Share.showDropDown(itemType, item, appendTo, true, possiblePermissions);
+						$(tr).addClass('mouseOver');
+						OC.Share.showDropDown(itemType, $(tr).data('id'), appendTo, true, possiblePermissions);
 					});
 				} else {
 					OC.Share.hideDropDown();
 				}
 			} else {
-				$('tr').filterAttr('data-file',filename).addClass('mouseOver');
-				OC.Share.showDropDown(itemType, item, appendTo, true, possiblePermissions);
+				$(tr).addClass('mouseOver');
+				OC.Share.showDropDown(itemType, $(tr).data('id'), appendTo, true, possiblePermissions);
 			}
 		});
 	}
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index ae6315600f80c58dac610637e27447a6fb59201d..5005d9a39d671c42dd6d53e7a4b06330c69f9284 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -26,30 +26,40 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
 	const FORMAT_FILE_APP_ROOT = 2;
 	const FORMAT_OPENDIR = 3;
 
-	public function isValidSource($item, $uid) {
-		if (OC_Filesystem::file_exists($item)) {
+	private $path;
+	
+	public function isValidSource($itemSource, $uidOwner) {
+		$path = OC_FileCache::getPath($itemSource, $uidOwner);
+		if (OC_Filesystem::file_exists($path)) {
+			$this->path = $path;
 			return true;
 		}
 		return false;
 	}
 
-	public function getFilePath($item, $uid) {
-		return $item;
+	public function getFilePath($itemSource, $uidOwner) {
+		if (isset($this->path)) {
+			$path = $this->path;
+			$this->path = null;
+			return $path;
+		}
+		return false;
 	}
 
-	public function generateTarget($item, $uid, $exclude = null) {
+	public function generateTarget($itemSource, $shareWith, $exclude = null) {
 		// TODO Make sure target path doesn't exist already
-		return $item;
+		return $itemSource;
 	}
 
 	public function formatItems($items, $format, $parameters = null) {
 		if ($format == self::FORMAT_SHARED_STORAGE) {
 			// Only 1 item should come through for this format call
-			return array('path' => $items[key($items)]['file_source'], 'permissions' => $items[key($items)]['permissions']);
+			return array('path' => $items[key($items)]['path'], 'permissions' => $items[key($items)]['permissions']);
 		} else if ($format == self::FORMAT_FILE_APP) {
 			$files = array();
 			foreach ($items as $item) {
 				$file = array();
+				$file['id'] = $item['file_source'];
 				$file['path'] = $item['file_target'];
 				$file['name'] = basename($item['file_target']);
 				$file['ctime'] = $item['ctime'];
@@ -77,7 +87,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
 				}
 				$size += $item['size'];
 			}
-			return array(0 => array('name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false, 'type' => 'dir', 'directory' => '', 'permissions' => OCP\Share::PERMISSION_READ));
+			return array(0 => array('id' => -1, 'name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false, 'type' => 'dir', 'directory' => '', 'permissions' => OCP\Share::PERMISSION_READ));
 		} else if ($format == self::FORMAT_OPENDIR) {
 			$files = array();
 			foreach ($items as $item) {
diff --git a/apps/files_sharing/lib/share/folder.php b/apps/files_sharing/lib/share/folder.php
index b6db96614fd5afbc09a5abacc4905bbd9396b286..665583e83ad603e3cc75d5e07b32dedaf68120c3 100644
--- a/apps/files_sharing/lib/share/folder.php
+++ b/apps/files_sharing/lib/share/folder.php
@@ -24,7 +24,7 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File {
 	public function formatItems($items, $format, $parameters = null) {
 		if ($format == self::FORMAT_SHARED_STORAGE) {
 			// Only 1 item should come through for this format call
-			return array('path' => $items[key($items)]['file_source'], 'permissions' => $items[key($items)]['permissions']);
+			return array('path' => $items[key($items)]['path'], 'permissions' => $items[key($items)]['permissions']);
 		} else if ($format == self::FORMAT_FILE_APP && isset($parameters['folder'])) {
 			// Only 1 item should come through for this format call
 			$folder = $items[key($items)];
@@ -33,7 +33,7 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File {
 			} else {
 				$mimetype_filter = '';
 			}
-			$path = $folder['file_source'].substr($parameters['folder'], 7 + strlen($folder['file_target']));
+			$path = $folder['path'].substr($parameters['folder'], 7 + strlen($folder['file_target']));
 			$files = OC_FileCache::getFolderContent($path, '', $mimetype_filter);
 			foreach ($files as &$file) {
 				$file['directory'] = $parameters['folder'];
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 582c9c661724b5cfe74c5dc89918fa289950f45c..527cec0afe3d25331ff4dd8bccfbf1ccde15843a 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -312,21 +312,32 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
 	}
 	
 	public function rename($path1, $path2) {
-		if ($oldSource = $this->getSourcePath($path1)) {
-			$root1 = substr($path1, 0, strpos($path1, '/'));
-			$root2 = substr($path2, 0, strpos($path2, '/'));
-			// Moving/renaming is only allowed within the same shared folder
-			if ($root1 == $root2) {
-				$storage = OC_Filesystem::getStorage($oldSource);
-				$newSource = substr($oldSource, 0, strpos($oldSource, $root1)).$path2;
-				if (dirname($path1) == dirname($path2)) {
-					// Rename the file if UPDATE permission is granted
-					if ($this->isUpdatable($path1)) {
+		// Renaming/moving is only allowed within shared folders
+		$pos1 = strpos($path1, '/', 1);
+		$pos2 = strpos($path2, '/', 1);
+		if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) {
+			$newSource = $this->getSourcePath(dirname($path2)).'/'.basename($path2);
+			if (dirname($path1) == dirname($path2)) {
+				// Rename the file if UPDATE permission is granted
+				if ($this->isUpdatable($path1)) {
+					$storage = OC_Filesystem::getStorage($oldSource);
+					return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource));
+				}
+			} else {
+				// Move the file if DELETE and CREATE permissions are granted
+				if ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
+					// Get the root shared folder
+					$folder1 = substr($path1, 0, $pos1);
+					$folder2 = substr($path2, 0, $pos2);
+					// Copy and unlink the file if it exists in a different shared folder
+					if ($folder1 != $folder2) {
+						if ($this->copy($path1, $path2)) {
+							return $this->unlink($path1);
+						}
+					} else {
+						$storage = OC_Filesystem::getStorage($oldSource);
 						return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource));
 					}
-				// Move the file if DELETE and CREATE permissions are granted
-				} else if ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
-					return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource));
 				}
 			}
 		}
@@ -335,12 +346,12 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
 	
 	public function copy($path1, $path2) {
 		// Copy the file if CREATE permission is granted
-		if (($source = $this->getSourcePath($path1)) && $this->isCreatable(dirname($path2))) {
+		if ($this->isCreatable(dirname($path2))) {
 			$source = $this->fopen($path1, 'r');
 			$target = $this->fopen($path2, 'w');
 			return OC_Helper::streamCopy($source, $target);
 		}
-		return true;
+		return false;
 	}
 
 	public function fopen($path, $mode) {
diff --git a/core/ajax/share.php b/core/ajax/share.php
index 04294a36ac09e948e1a154942d24d65f1e9c3c5d..806ca9fb98f3df0a58acd02f3d898475fa941851 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -56,9 +56,13 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
 			}
 			break;
 		case 'getItem':
-			if (isset($_GET['itemType']) && isset($_GET['itemSource']) && isset($_GET['checkShares'])) {
-				$reshare = OCP\Share::getItemSharedWithBySource($_GET['itemType'], $_GET['itemSource'], OCP\Share::FORMAT_NONE, null, true);
-				if ($_GET['checkShares'] == "true") {
+			if (isset($_GET['itemType']) && isset($_GET['itemSource']) && isset($_GET['checkReshare']) && isset($_GET['checkShares'])) {
+				if ($_GET['checkReshare'] == 'true') {
+					$reshare = OCP\Share::getItemSharedWithBySource($_GET['itemType'], $_GET['itemSource'], OCP\Share::FORMAT_NONE, null, true);
+				} else {
+					$reshare = false;
+				}
+				if ($_GET['checkShares'] == 'true') {
 					$shares = OCP\Share::getItemShared($_GET['itemType'], $_GET['itemSource']);
 				} else {
 					$shares = false;
diff --git a/core/css/share.css b/core/css/share.css
index a683a24a11660577a07fdac0fdf1e9015327a7af..e4b4870dd163a0171f37c837181ae07a46df7c50 100644
--- a/core/css/share.css
+++ b/core/css/share.css
@@ -2,10 +2,11 @@
  This file is licensed under the Affero General Public License version 3 or later.
  See the COPYING-README file. */
 
-#dropdown { display:block;  position:absolute; z-index:500; width:16em; right:0; margin-right:7em; background:#eee; padding:1em;
+#dropdown { display:block; position:absolute; z-index:500; width:19em; right:0; margin-right:7em; background:#eee; padding:1em;
 -moz-box-shadow:0 1px 1px #777; -webkit-box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777;
 -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em;
 -moz-border-radius-bottomright:1em; -webkit-border-bottom-right-radius:1em; border-bottom-right-radius:1em; }
+.reshare { padding-left:0.5em; }
 #shareWithList { padding:0.5em; list-style-type: none; }
 #shareWithList li { padding-top:0.1em; }
 #dropdown label { font-weight:normal; }
diff --git a/core/js/share.js b/core/js/share.js
index e765303a267ded1b5bc2e548034e53c89cd64430..3db69dc69010287b2d13e45dd20fd4e823fc1557 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -30,14 +30,57 @@ OC.Share={
 			}
 		});
 	},
+	updateIcon:function(itemType, itemSource) {
+		if (itemType == 'file' || itemType == 'folder') {
+			var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file');
+			if ($('#dir').val() == '/') {
+				itemSource = $('#dir').val() + filename;
+			} else {
+				itemSource = $('#dir').val() + '/' + filename;
+			}
+		}
+		var shares = false;
+		$.each(OC.Share.itemShares, function(index) {
+			if (OC.Share.itemShares[index].length > 0) {
+				shares = true;
+				return;
+			}
+		});
+		if (shares) {
+			$('a.share[data-item="'+itemSource+'"]').css('background', 'url('+OC.imagePath('core', 'actions/shared')+') no-repeat center');
+			if (typeof OC.Share.statuses[itemSource] === 'undefined') {
+				OC.Share.statuses[itemSource] = false;
+			}
+		} else {
+			if (itemType != 'file' && itemType != 'folder') {
+				$('a.share[data-item="'+itemSource+'"]').css('background', 'url('+OC.imagePath('core', 'actions/share')+') no-repeat center');
+			}
+			delete OC.Share.statuses[itemSource];
+		}
+	},
 	loadItem:function(itemType, itemSource) {
 		var data = '';
-		if (typeof OC.Share.statuses[itemSource] === 'undefined') {
+		var checkReshare = true;
+		// Switch file sources to path to check if status is set
+		if (itemType == 'file' || itemType == 'folder') {
+			var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file');
+			if ($('#dir').val() == '/') {
+				var item = $('#dir').val() + filename;
+			} else {
+				var item = $('#dir').val() + '/' + filename;
+			}
+			if (item.substring(0, 8) != '/Shared/') {
+				checkReshare = false;
+			}
+		} else {
+			var item = itemSource;
+		}
+		if (typeof OC.Share.statuses[item] === 'undefined') {
 			checkShares = false;
 		} else {
 			checkShares = true;
 		}
-		$.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkShares: checkShares }, async: false, success: function(result) {
+		$.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkReshare: checkReshare, checkShares: checkShares }, async: false, success: function(result) {
 			if (result && result.status === 'success') {
 				data = result.data;
 			} else {
@@ -80,71 +123,79 @@ OC.Share={
 		var html = '<div id="dropdown" class="drop" data-item-type="'+itemType+'" data-item-source="'+itemSource+'">';
 		if (data.reshare) {
 			if (data.reshare.share_type == OC.Share.SHARE_TYPE_GROUP) {
-				html += 'Shared with you and the group '+data.reshare.share_with+' by '+data.reshare.uid_owner;
+				html += '<span class="reshare">Shared with you and the group '+data.reshare.share_with+' by '+data.reshare.uid_owner+'</span>';
 			} else {
-				html += 'Shared with you by '+data.reshare.uid_owner;
+				html += '<span class="reshare">Shared with you by '+data.reshare.uid_owner+'</span>';
 			}
 			html += '<br />';
 		}
-		html += '<input id="shareWith" type="text" placeholder="Share with" style="width:90%;"/>';
-		html += '<ul id="shareWithList">';
-		html += '</ul>';
-		if (privateLink) {
-			html += '<div id="privateLink">';
-			html += '<input type="checkbox" name="privateLinkCheckbox" id="privateLinkCheckbox" value="1" /><label for="privateLinkCheckbox">Share with private link</label>';
-			html += '<br />';
-			html += '<input id="privateLinkText" style="display:none; width:90%;" readonly="readonly" />';
+		if (possiblePermissions & OC.Share.PERMISSION_SHARE) {
+			html += '<input id="shareWith" type="text" placeholder="Share with" style="width:90%;"/>';
+			html += '<ul id="shareWithList">';
+			html += '</ul>';
+			if (privateLink) {
+				html += '<div id="privateLink">';
+				html += '<input type="checkbox" name="privateLinkCheckbox" id="privateLinkCheckbox" value="1" /><label for="privateLinkCheckbox">Share with private link</label>';
+				html += '<br />';
+				html += '<input id="privateLinkText" style="display:none; width:90%;" readonly="readonly" />';
+				html += '</div>';
+			}
 			html += '</div>';
-		}
-		html += '</div>';
-		$(html).appendTo(appendTo);
-		// Reset item shares
-		OC.Share.itemShares = [];
-		if (data.shares) {
-			$.each(data.shares, function(index, share) {
-				if (share.share_type == OC.Share.SHARE_TYPE_PRIVATE_LINK) {
-					OC.Share.showPrivateLink(item, share.share_with);
-				} else {
-					OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions);
-
-				}
-			});
-		}
-		$('#shareWith').autocomplete({minLength: 2, source: function(search, response) {
-// 			if (cache[search.term]) {
-// 				response(cache[search.term]);
-// 			} else {
-				$.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term, itemShares: OC.Share.itemShares }, function(result) {
-					if (result.status == 'success' && result.data.length > 0) {
-						response(result.data);
+			$(html).appendTo(appendTo);
+			// Reset item shares
+			OC.Share.itemShares = [];
+			if (data.shares) {
+				$.each(data.shares, function(index, share) {
+					if (share.share_type == OC.Share.SHARE_TYPE_PRIVATE_LINK) {
+						OC.Share.showPrivateLink(item, share.share_with);
 					} else {
-						// Suggest sharing via email if valid email address
-						var pattern = new RegExp(/^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i);
-						if (pattern.test(search.term)) {
-							response([{label: 'Share via email: '+search.term, value: {shareType: OC.Share.SHARE_TYPE_EMAIL, shareWith: search.term}}]);
+						OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions);
+					}
+				});
+			}
+			$('#shareWith').autocomplete({minLength: 2, source: function(search, response) {
+	// 			if (cache[search.term]) {
+	// 				response(cache[search.term]);
+	// 			} else {
+					$.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term, itemShares: OC.Share.itemShares }, function(result) {
+						if (result.status == 'success' && result.data.length > 0) {
+							response(result.data);
 						} else {
-							response(['No people found']);
+							// Suggest sharing via email if valid email address
+							var pattern = new RegExp(/^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i);
+							if (pattern.test(search.term)) {
+								response([{label: 'Share via email: '+search.term, value: {shareType: OC.Share.SHARE_TYPE_EMAIL, shareWith: search.term}}]);
+							} else {
+								response(['No people found']);
+							}
 						}
-					}
+					});
+	// 			}
+			},
+			focus: function(event, focused) {
+				event.preventDefault();
+			},
+			select: function(event, selected) {
+				var itemType = $('#dropdown').data('item-type');
+				var itemSource = $('#dropdown').data('item-source');
+				var shareType = selected.item.value.shareType;
+				var shareWith = selected.item.value.shareWith;
+				$(this).val(shareWith);
+				// Default permissions are Read and Share
+				var permissions = OC.Share.PERMISSION_READ | OC.Share.PERMISSION_SHARE;
+				OC.Share.share(itemType, itemSource, shareType, shareWith, permissions, function() {
+					OC.Share.addShareWith(shareType, shareWith, permissions, possiblePermissions);
+					$('#shareWith').val('');
+					OC.Share.updateIcon(itemType, itemSource);
 				});
-// 			}
-		},
-		focus: function(event, focused) {
-			event.preventDefault();
-		},
-		select: function(event, selected) {
-			var shareType = selected.item.value.shareType;
-			var shareWith = selected.item.value.shareWith;
-			$(this).val(shareWith);
-			// Default permissions are Read and Share
-			var permissions = OC.Share.PERMISSION_READ | OC.Share.PERMISSION_SHARE;
-			OC.Share.share($('#dropdown').data('item-type'), $('#dropdown').data('item-source'), shareType, shareWith, permissions, function() {
-				OC.Share.addShareWith(shareType, shareWith, permissions, possiblePermissions);
-				$('#shareWith').val('');
+				return false;
+			}
 			});
-			return false;
+		} else {
+			html += '<input id="shareWith" type="text" placeholder="Resharing is not allowed" style="width:90%;" disabled="disabled"/>';
+			html += '</div>';
+			$(html).appendTo(appendTo);
 		}
-		});
 		$('#dropdown').show('blind', function() {
 			OC.Share.droppedDown = true;
 		});
@@ -306,12 +357,15 @@ $(document).ready(function() {
 
 	$('.unshare').live('click', function() {
 		var li = $(this).parent();
+		var itemType = $('#dropdown').data('item-type');
+		var itemSource = $('#dropdown').data('item-source');
 		var shareType = $(li).data('share-type');
 		var shareWith = $(li).data('share-with');
-		OC.Share.unshare($('#dropdown').data('item-type'), $('#dropdown').data('item-source'), shareType, shareWith, function() {
+		OC.Share.unshare(itemType, itemSource, shareType, shareWith, function() {
 			$(li).remove();
 			var index = OC.Share.itemShares[shareType].indexOf(shareWith);
 			OC.Share.itemShares[shareType].splice(index, 1);
+			OC.Share.updateIcon(itemType, itemSource);
 		});
 	});
 
diff --git a/lib/filecache/cached.php b/lib/filecache/cached.php
index 17a792a23d4a7bd2cb39868828933a2467dce582..1e17666717e703f5d86cb3228915a48fd2fc942f 100644
--- a/lib/filecache/cached.php
+++ b/lib/filecache/cached.php
@@ -58,7 +58,7 @@ class OC_FileCache_Cached{
 		if($parent==-1){
 			return array();
 		}
-		$query=OC_DB::prepare('SELECT path,name,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE parent=? AND (mimetype LIKE ? OR mimetype = ?)');
+		$query=OC_DB::prepare('SELECT id,path,name,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE parent=? AND (mimetype LIKE ? OR mimetype = ?)');
 		$result=$query->execute(array($parent, $mimetype_filter.'%', 'httpd/unix-directory'))->fetchAll();
 		if(is_array($result)){
 			return $result;
diff --git a/lib/public/share.php b/lib/public/share.php
index 6221c75763f9a49470ac5e207f9cb1bb6c6ef31a..c894b31763154f699549a72e1e47a34ed97311b4 100644
--- a/lib/public/share.php
+++ b/lib/public/share.php
@@ -237,8 +237,16 @@ class Share {
 						// Continue scanning into child folders
 						array_push($files, $children);
 					} else {
+						// Check file extension for an equivalent item type to convert to
+						$extension = strtolower(substr($itemSource, strrpos($itemSource, '.') + 1));
+						foreach (self::$backends as $type => $backend) {
+							if (isset($backend->dependsOn) && $backend->dependsOn == 'file' && isset($backend->supportedFileExtensions) && in_array($extension, $backend->supportedFileExtensions)) {
+								$itemType = $type;
+								break;
+							}
+						}
 						// Pass on to put() to check if this item should be converted, the item won't be inserted into the database unless it can be converted
-						self::put('file', $name, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder);
+						self::put($itemType, $name, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder);
 					}
 				}
 				return true;
@@ -425,7 +433,7 @@ class Share {
 		} else {
 			$fileDependent = false;
 			$root = '';
-			if ($includeCollections && !isset($item) && $collectionTypes = self::getCollectionItemTypes($itemType)) {
+			if ($includeCollections && !isset($item) && ($collectionTypes = self::getCollectionItemTypes($itemType))) {
 				// If includeCollections is true, find collections of this item type, e.g. a music album contains songs
 				$itemTypes = array_merge(array($itemType), $collectionTypes);
 				$placeholders = join(',', array_fill(0, count($itemTypes), '?'));
@@ -481,12 +489,11 @@ class Share {
 			if (isset($uidOwner) || $itemShareWithBySource) {
 				// If item type is a file, file source needs to be checked in case the item was converted
 				if ($itemType == 'file' || $itemType == 'folder') {
-					$where .= " AND path = ?";
-					$queryArgs[] = $root.$item;
+					$where .= ' AND file_source = ?';
+					$column = 'file_source';
 				} else {
 					$where .= " AND item_source = ?";
 					$column = 'item_source';
-					$queryArgs[] = $item;
 				}
 			} else {
 				if ($itemType == 'file' || $itemType == 'folder') {
@@ -494,8 +501,8 @@ class Share {
 				} else {
 					$where .= " AND item_target = ?";
 				}
-				$queryArgs[] = $item;
 			}
+			$queryArgs[] = $item;
 			if ($includeCollections && $collectionTypes = self::getCollectionItemTypes($itemType)) {
 				// TODO Bart - this doesn't work with only one argument
 // 				$placeholders = join(',', array_fill(0, count($collectionTypes), '?'));
@@ -519,23 +526,23 @@ class Share {
 		// TODO Optimize selects
 		if ($format == self::FORMAT_STATUSES) {
 			if ($itemType == 'file' || $itemType == 'folder') {
-				$select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, *PREFIX*fscache.path as file_source';
+				$select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, file_source, path';
 			} else {
 				$select = 'id, item_type, item_source, parent, share_type';
 			}
 		} else {
 			if (isset($uidOwner)) {
 				if ($itemType == 'file' || $itemType == 'folder') {
-					$select = '*PREFIX*share.id, item_type, *PREFIX*fscache.path as file_source, *PREFIX*share.parent, share_type, share_with, permissions, stime';
+					$select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, file_source, path, permissions, stime';
 				} else {
 					$select = 'id, item_type, item_source, parent, share_type, share_with, permissions, stime, file_source';
 				}
 			} else {
 				if ($fileDependent) {
 					if (($itemType == 'file' || $itemType == 'folder') && $format == \OC_Share_Backend_File::FORMAT_FILE_APP || $format == \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT) {
-						$select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, permissions, file_target, *PREFIX*fscache.id, path as file_source, name, ctime, mtime, mimetype, size, encrypted, versioned, writable';
+						$select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, file_source, path, file_target, permissions, name, ctime, mtime, mimetype, size, encrypted, versioned, writable';
 					} else {
-						$select = '*PREFIX*share.id, item_type, item_source, item_target, *PREFIX*share.parent, share_type, share_with, uid_owner, permissions, stime, path as file_source, file_target';
+						$select = '*PREFIX*share.id, item_type, item_source, item_target, *PREFIX*share.parent, share_type, share_with, uid_owner, file_source, path, file_target, permissions, stime';
 					}
 				} else {
 					$select = '*';
@@ -580,11 +587,11 @@ class Share {
 				}
 			}
 			// Remove root from file source paths if retrieving own shared items
-			if (isset($uidOwner) && isset($row['file_source'])) {
+			if (isset($uidOwner) && isset($row['path'])) {
 				if (isset($row['parent'])) {
-					$row['file_source'] = '/Shared/'.basename($row['file_source']);
+					$row['path'] = '/Shared/'.basename($row['path']);
 				} else {
-					$row['file_source'] = substr($row['file_source'], $root);
+					$row['path'] = substr($row['path'], $root);
 				}
 			}
 			$items[$row['id']] = $row;
@@ -601,7 +608,7 @@ class Share {
 					}
 				}
 				// Check if this is a collection of the requested item type
-				if ($includeCollections && $row['item_type'] != $itemType && $collectionBackend = self::getBackend($row['item_type']) && $collectionBackend instanceof Share_Backend_Collection) {
+				if ($includeCollections && $row['item_type'] != $itemType && ($collectionBackend = self::getBackend($row['item_type'])) && $collectionBackend instanceof Share_Backend_Collection) {
 					$row['collection'] = array('item_type' => $itemType, $column => $row[$column]);
 					// Fetch all of the children sources
 					$children = $collectionBackend->getChildren($row[$column]);
@@ -636,6 +643,10 @@ class Share {
 				return $items;
 			} else if ($format == self::FORMAT_STATUSES) {
 				$statuses = array();
+				// Switch column to path for files and folders, used for determining statuses inside of folders
+				if ($itemType == 'file' || $itemType == 'folder') {
+					$column = 'path';
+				}
 				foreach ($items as $item) {
 					if ($item['share_type'] == self::SHARE_TYPE_PRIVATE_LINK) {
 						$statuses[$item[$column]] = true;
@@ -664,20 +675,6 @@ class Share {
 	* @return bool Returns true on success or false on failure
 	*/
 	private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder = null) {
-		// Check file extension for an equivalent item type to convert to
-		if ($itemType == 'file') {
-			$extension = strtolower(substr($itemSource, strrpos($itemSource, '.') + 1));
-			foreach (self::$backends as $type => $backend) {
-				if (isset($backend->dependsOn) && $backend->dependsOn == 'file' && isset($backend->supportedFileExtensions) && in_array($extension, $backend->supportedFileExtensions)) {
-					$itemType = $type;
-					break;
-				}
-			}
-			// Exit if this is being called for a file inside a folder, and no equivalent item type is found
-			if (isset($parentFolder) && $itemType == 'file') {
-				return false;
-			}
-		}
 		$backend = self::getBackend($itemType);
 		// Check if this is a reshare
 		if ($checkReshare = self::getItemSharedWithBySource($itemType, $itemSource, self::FORMAT_NONE, null, true)) {
@@ -686,24 +683,6 @@ class Share {
 				$message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is the original sharer';
 				\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
 				throw new \Exception($message);
-			// Check if attempting to share back to group TODO Check unique user target
-			} else if ($shareType == self::SHARE_TYPE_GROUP && $checkReshare['share_with'] == $shareWith['group']) {
-				$message = 'Sharing '.$itemSource.' failed, because the item was orignally shared with the group '.$shareWith['group'];
-				\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
-				throw new \Exception($message);
-			// Check if attempting to share back a group share to a member of the same group
-			} else if (($checkReshare['share_type'] == self::SHARE_TYPE_GROUP || $checkReshare['share_type'] == self::$shareTypeGroupUserUnique) && $shareType == self::SHARE_TYPE_USER) {
-				if ($checkReshare['share_type'] == self::$shareTypeGroupUserUnique) {
-					$query = \OC_DB::prepare('SELECT share_with FROM *PREFIX*share WHERE id = ?');
-					$group = $query->execute(array($checkReshare['parent']))->fetchOne();
-				} else {
-					$group = $checkReshare['share_with'];
-				}
-				if (\OC_Group::inGroup($shareWith, $group)) {
-					$message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is a member of the original group share';
-					\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
-					throw new \Exception($message);
-				}
 			}
 			// Check if share permissions is granted
 			if ((int)$checkReshare['permissions'] & self::PERMISSION_SHARE) {
@@ -734,9 +713,12 @@ class Share {
 			}
 			$parent = null;
 			if ($backend instanceof Share_Backend_File_Dependent) {
-				// NOTE Apps should start using the file cache ids in their tables
 				$filePath = $backend->getFilePath($itemSource, $uidOwner);
-				$fileSource = \OC_FileCache::getId($filePath);
+				if ($itemType == 'file' && $itemType == 'folder') {
+					$fileSource = $itemSource;
+				} else {
+					$fileSource = \OC_FileCache::getId($filePath);
+				}
 				if ($fileSource == -1) {
 					$message = 'Sharing '.$itemSource.' failed, because the file could not be found in the file cache';
 					\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);