diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index d0dbd65eaeef2858e500f8dc2d8e2cf572f854d7..fefb06a8ac5539624b13a433f2ca4c3504d8821a 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -539,7 +539,7 @@ $(document).ready(function() {
 								lazyLoadPreview(path, result.data.mime, function(previewpath){
 									tr.find('td.filename').attr('style','background-image:url('+previewpath+')');
 								});
-								FileActions.display(tr.find('td.filename'));
+								FileActions.display(tr.find('td.filename'), true);
 							} else {
 								OC.dialogs.alert(result.data.message, t('core', 'Error'));
 							}
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index e14e52eb6ca990d3fc2d0880b90b0d26361c7ab2..03e23189a9708b04d833d74f044aa5bdf017b908 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -61,7 +61,13 @@ var FileActions = {
 		var actions = this.get(mime, type, permissions);
 		return actions[name];
 	},
-	display: function (parent) {
+	/**
+	 * Display file actions for the given element
+	 * @param parent "td" element of the file for which to display actions
+	 * @param triggerEvent if true, triggers the fileActionsReady on the file
+	 * list afterwards (false by default)
+	 */
+	display: function (parent, triggerEvent) {
 		FileActions.currentFile = parent;
 		var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
 		var file = FileActions.getCurrentFile();
@@ -137,6 +143,10 @@ var FileActions = {
 			element.on('click', {a: null, elem: parent, actionFunc: actions['Delete']}, actionHandler);
 			parent.parent().children().last().append(element);
 		}
+
+		if (triggerEvent){
+			$('#fileList').trigger(jQuery.Event("fileActionsReady"));
+		}
 	},
 	getCurrentFile: function () {
 		return FileActions.currentFile.parent().attr('data-file');
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index e7edd2cf38847f869a86894b3ce44ea6f9788a71..84ff1093253caf8aed02c40a4e18c2882fd5c141 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -151,7 +151,7 @@ var FileList={
 		if (hidden) {
 			tr.hide();
 		}
-		FileActions.display(tr.find('td.filename'));
+		FileActions.display(tr.find('td.filename'), true);
 		return tr;
 	},
 	/**
@@ -817,7 +817,7 @@ $(document).ready(function(){
 					data.context.attr('data-permissions', file.permissions);
 					data.context.data('permissions', file.permissions);
 				}
-				FileActions.display(data.context.find('td.filename'));
+				FileActions.display(data.context.find('td.filename'), true);
 
 				var path = getPathForPreview(file.name);
 				lazyLoadPreview(path, file.mime, function(previewpath){
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 03ed02f41ef0cf2557ad13013d24beba03d27e9d..68f6f3ba76f6e9d1eba761b534ea9d91be85227d 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -1,11 +1,19 @@
 $(document).ready(function() {
 
-	var disableSharing = $('#disableSharing').data('status');
+	var disableSharing = $('#disableSharing').data('status'),
+		sharesLoaded = false;
 
 	if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined'  && !disableSharing) {
-
 		$('#fileList').on('fileActionsReady',function(){
-			OC.Share.loadIcons('file');
+			if (!sharesLoaded){
+				OC.Share.loadIcons('file');
+				// assume that we got all shares, so switching directories
+				// will not invalidate that list
+				sharesLoaded = true;
+			}
+			else{
+				OC.Share.updateIcons('file');
+			}
 		});
 
 		FileActions.register('all', 'Share', OC.PERMISSION_READ, OC.imagePath('core', 'actions/share'), function(filename) {
diff --git a/core/js/share.js b/core/js/share.js
index b472797b3cd98cc277168483a72bc3764d26481a..270eab356e1fceadf607934842147e0d98d12e45 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -4,57 +4,76 @@ OC.Share={
 	SHARE_TYPE_LINK:3,
 	SHARE_TYPE_EMAIL:4,
 	itemShares:[],
-	statuses:[],
+	statuses:{},
 	droppedDown:false,
+	/**
+	 * Loads ALL share statuses from server, stores them in OC.Share.statuses then
+	 * calls OC.Share.updateIcons() to update the files "Share" icon to "Shared"
+	 * according to their share status and share type.
+	 */
 	loadIcons:function(itemType) {
 		// Load all share icons
 		$.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getItemsSharedStatuses', itemType: itemType }, function(result) {
 			if (result && result.status === 'success') {
+				OC.Share.statuses = {};
 				$.each(result.data, function(item, data) {
 					OC.Share.statuses[item] = data;
-					var hasLink = data['link'];
-					// Links override shared in terms of icon display
-					if (hasLink) {
-						var image = OC.imagePath('core', 'actions/public');
-					} else {
-						var image = OC.imagePath('core', 'actions/shared');
-					}
-					if (itemType != 'file' && itemType != 'folder') {
-						$('a.share[data-item="'+item+'"]').css('background', 'url('+image+') no-repeat center');
-					} else {
-						var file = $('tr[data-id="'+item+'"]');
-						if (file.length > 0) {
-							var action = $(file).find('.fileactions .action[data-action="Share"]');
-							var img = action.find('img').attr('src', image);
-							action.addClass('permanent');
-							action.html(' '+t('core', 'Shared')).prepend(img);
-						} else {
-							var dir = $('#dir').val();
-							if (dir.length > 1) {
-								var last = '';
-								var path = dir;
-								// Search for possible parent folders that are shared
-								while (path != last) {
-									if (path == data['path']) {
-										var actions = $('.fileactions .action[data-action="Share"]');
-										$.each(actions, function(index, action) {
-											var img = $(action).find('img');
-											if (img.attr('src') != OC.imagePath('core', 'actions/public')) {
-												img.attr('src', image);
-												$(action).addClass('permanent');
-												$(action).html(' '+t('core', 'Shared')).prepend(img);
-											}
-										});
+				});
+				OC.Share.updateIcons(itemType);
+			}
+		});
+	},
+	/**
+	 * Updates the files' "Share" icons according to the known
+	 * sharing states stored in OC.Share.statuses.
+	 * (not reloaded from server)
+	 */
+	updateIcons:function(itemType){
+		var item;
+		for (item in OC.Share.statuses){
+			var data = OC.Share.statuses[item];
+
+			var hasLink = data['link'];
+			// Links override shared in terms of icon display
+			if (hasLink) {
+				var image = OC.imagePath('core', 'actions/public');
+			} else {
+				var image = OC.imagePath('core', 'actions/shared');
+			}
+			if (itemType != 'file' && itemType != 'folder') {
+				$('a.share[data-item="'+item+'"]').css('background', 'url('+image+') no-repeat center');
+			} else {
+				var file = $('tr[data-id="'+item+'"]');
+				if (file.length > 0) {
+					var action = $(file).find('.fileactions .action[data-action="Share"]');
+					var img = action.find('img').attr('src', image);
+					action.addClass('permanent');
+					action.html(' '+t('core', 'Shared')).prepend(img);
+				} else {
+					var dir = $('#dir').val();
+					if (dir.length > 1) {
+						var last = '';
+						var path = dir;
+						// Search for possible parent folders that are shared
+						while (path != last) {
+							if (path == data['path']) {
+								var actions = $('.fileactions .action[data-action="Share"]');
+								$.each(actions, function(index, action) {
+									var img = $(action).find('img');
+									if (img.attr('src') != OC.imagePath('core', 'actions/public')) {
+										img.attr('src', image);
+										$(action).addClass('permanent');
+										$(action).html(' '+t('core', 'Shared')).prepend(img);
 									}
-									last = path;
-									path = OC.Share.dirname(path);
-								}
+								});
 							}
+							last = path;
+							path = OC.Share.dirname(path);
 						}
 					}
-				});
+				}
 			}
-		});
+		}
 	},
 	updateIcon:function(itemType, itemSource) {
 		var shares = false;