diff --git a/apps/files_sharing/lib/propagation/changewatcher.php b/apps/files_sharing/lib/propagation/changewatcher.php
index 9da3ffe51a294bad50fb0ba7e673164743e47072..f9b28c7f967c891c07b6e229339d45674683ce55 100644
--- a/apps/files_sharing/lib/propagation/changewatcher.php
+++ b/apps/files_sharing/lib/propagation/changewatcher.php
@@ -99,4 +99,12 @@ class ChangeWatcher {
 			$propagator->propagateChanges();
 		}
 	}
+
+	public function permissionsHook($params) {
+		$share = $params['share'];
+
+		if ($share['item_type'] === 'file' || $share['item_type'] === 'folder') {
+			$this->recipientPropagator->markDirty($share, time());
+		}
+	}
 }
diff --git a/apps/files_sharing/lib/propagation/propagationmanager.php b/apps/files_sharing/lib/propagation/propagationmanager.php
index d220551f8d65555291c10d58868e8ce6496a9e2c..7fcf467de9a22d61de527edeedbc433129cd0634 100644
--- a/apps/files_sharing/lib/propagation/propagationmanager.php
+++ b/apps/files_sharing/lib/propagation/propagationmanager.php
@@ -25,6 +25,7 @@ use OC\Files\Filesystem;
 use OC\Files\View;
 use OCP\IConfig;
 use OCP\IUserSession;
+use OCP\Util;
 
 
 /**
@@ -119,8 +120,9 @@ class PropagationManager {
 
 		// for marking shares owned by the active user as dirty when a file inside them changes
 		$this->listenToOwnerChanges($user->getUID(), $user->getUID());
-		\OC_Hook::connect('OC_Filesystem', 'post_write', $watcher, 'writeHook');
-		\OC_Hook::connect('OC_Filesystem', 'post_delete', $watcher, 'writeHook');
-		\OC_Hook::connect('OC_Filesystem', 'post_rename', $watcher, 'renameHook');
+		Util::connectHook('OC_Filesystem', 'post_write', $watcher, 'writeHook');
+		Util::connectHook('OC_Filesystem', 'post_delete', $watcher, 'writeHook');
+		Util::connectHook('OC_Filesystem', 'post_rename', $watcher, 'renameHook');
+		Util::connectHook('OCP\Share', 'post_update_permissions', $watcher, 'permissionsHook');
 	}
 }
diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php
index 6d23959d66db19be8769514e454613e7913b81e0..427e371cd06c9d2b2b3b90361a11cbf0003f5037 100644
--- a/apps/files_sharing/tests/etagpropagation.php
+++ b/apps/files_sharing/tests/etagpropagation.php
@@ -406,4 +406,17 @@ class EtagPropagation extends TestCase {
 
 		$this->assertAllUnchaged();
 	}
+
+	public function testEtagChangeOnPermissionsChange() {
+		$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+
+		$view = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
+		$folderInfo = $view->getFileInfo('/sub1/sub2/folder');
+
+		\OCP\Share::setPermissions('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 17);
+
+		$this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
+
+		$this->assertAllUnchaged();
+	}
 }
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 97c36a03c864bcf2a2080e38f05d9a723f611126..7f9b899bf637288c93948d9622f64e63dde9c91a 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1099,6 +1099,7 @@ class Share extends Constants {
 					'uidOwner' => \OC_User::getUser(),
 					'permissions' => $permissions,
 					'path' => $item['path'],
+					'share' => $item
 				));
 			}
 			// Check if permissions were removed
@@ -1109,16 +1110,18 @@ class Share extends Constants {
 					Helper::delete($item['id'], true, null, null, true);
 				} else {
 					$ids = array();
+					$items = [];
 					$parents = array($item['id']);
 					while (!empty($parents)) {
 						$parents = "'".implode("','", $parents)."'";
-						$query = \OC_DB::prepare('SELECT `id`, `permissions` FROM `*PREFIX*share`'
+						$query = \OC_DB::prepare('SELECT `id`, `permissions`, `item_type` FROM `*PREFIX*share`'
 							.' WHERE `parent` IN ('.$parents.')');
 						$result = $query->execute();
 						// Reset parents array, only go through loop again if
 						// items are found that need permissions removed
 						$parents = array();
 						while ($item = $result->fetchRow()) {
+							$items[] = $item;
 							// Check if permissions need to be removed
 							if ($item['permissions'] & ~$permissions) {
 								// Add to list of items that need permissions removed
@@ -1140,8 +1143,13 @@ class Share extends Constants {
 							.' WHERE `id` IN ('.$ids.')');
 						$query->execute(array($permissions));
 					}
+
+					foreach ($items as $item) {
+						\OC_Hook::emit('OCP\Share', 'post_update_permissions', ['share' => $item]);
+					}
 				}
 			}
+
 			return true;
 		}
 		$message = 'Setting permissions for %s failed, because the item was not found';