diff --git a/core/ajax/share.php b/core/ajax/share.php
index 3d3436c71fb59e28e8c38d1ffee5aa4da1ec16bf..c613baa7f5e408cff23d1b046c6921c971cb4f72 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -66,14 +66,37 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['item']
 			break;
 		case 'getShareWith':
 			if (isset($_GET['search'])) {
+				// TODO Include contacts
 				$shareWith = array();
-				$users = OC_User::getUsers($_GET['search'], 4);
-				foreach ($users as $user) {
-					$shareWith[] = array('label' => $user, 'value' => array('shareType' => OCP\Share::SHARE_TYPE_USER, 'shareWith' => $user));
+				$count = 0;
+				$users = array();
+				$limit = 0;
+				$offset = 0;
+				while ($count < 4 && count($users) == $limit) {
+					$limit = 4 - $count;
+					$users = OC_User::getUsers($_GET['search'], $limit, $offset);
+					$offset += $limit;
+					foreach ($users as $user) {
+						if ((!isset($_GET['itemShares'][OCP\Share::SHARE_TYPE_USER]) || !in_array($user, $_GET['itemShares'][OCP\Share::SHARE_TYPE_USER])) && $user != OC_User::getUser()) {
+							$shareWith[] = array('label' => $user, 'value' => array('shareType' => OCP\Share::SHARE_TYPE_USER, 'shareWith' => $user));
+							$count++;
+						}
+					}
 				}
-				$groups = OC_Group::getGroups($_GET['search'], 4);
-				foreach ($groups as $group) {
-					$shareWith[] = array('label' => $group.' (group)', 'value' => array('shareType' => OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => $group));
+				$count = 0;
+				$groups = array();
+				$limit = 0;
+				$offset = 0;
+				while ($count < 4 && count($groups) == $limit) {
+					$limit = 4 - $count;
+					$groups = OC_Group::getGroups($_GET['search'], $limit, $offset);
+					$offset += $limit;
+					foreach ($groups as $group) {
+						if (!isset($_GET['itemShares'][OCP\Share::SHARE_TYPE_GROUP]) || !in_array($group, $_GET['itemShares'][OCP\Share::SHARE_TYPE_GROUP])) {
+							$shareWith[] = array('label' => $group.' (group)', 'value' => array('shareType' => OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => $group));
+							$count++;
+						}
+					}
 				}
 				OC_JSON::success(array('data' => $shareWith));
 			}
diff --git a/core/js/share.js b/core/js/share.js
index 811f90070876845ec2f4d91f253ac4be880b1fc4..44abc14ede4e6a216a8af0690e2140628b3e66f4 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -8,7 +8,7 @@ OC.Share={
 	PERMISSION_UPDATE:2,
 	PERMISSION_DELETE:8,
 	PERMISSION_SHARE:16,
-	item:[],
+	itemShares:[],
 	statuses:[],
 	loadIcons:function(itemType) {
 		// Load all share icons
@@ -91,6 +91,7 @@ OC.Share={
 					OC.Share.showPrivateLink(item, share.share_with);
 				} else {
 					OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions);
+					
 				}
 			});
 		}
@@ -99,7 +100,7 @@ OC.Share={
 // 			if (cache[search.term]) {
 // 				response(cache[search.term]);
 // 			} else {
-				$.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term }, function(result) {
+				$.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 {
@@ -136,6 +137,10 @@ OC.Share={
 		});
 	},
 	addShareWith:function(shareType, shareWith, permissions, possiblePermissions) {
+		if (!OC.Share.itemShares[shareType]) {
+			OC.Share.itemShares[shareType] = [];
+		}
+		OC.Share.itemShares[shareType].push(shareWith);
 		var editChecked = createChecked = updateChecked = deleteChecked = shareChecked = '';
 		if (permissions & OC.Share.PERMISSION_CREATE) {
 			createChecked = 'checked="checked"';