diff --git a/apps/files_sharing/lib/Activity/Providers/Groups.php b/apps/files_sharing/lib/Activity/Providers/Groups.php
index 10f52882aeb892c15e976c3e3b587d0a026025fd..9585646491c644f75bb95667fabd1a7e48acaeeb 100644
--- a/apps/files_sharing/lib/Activity/Providers/Groups.php
+++ b/apps/files_sharing/lib/Activity/Providers/Groups.php
@@ -35,9 +35,12 @@ class Groups extends Base {
 
 	const SUBJECT_SHARED_GROUP_SELF = 'shared_group_self';
 	const SUBJECT_RESHARED_GROUP_BY = 'reshared_group_by';
+
 	const SUBJECT_UNSHARED_GROUP_SELF = 'unshared_group_self';
 	const SUBJECT_UNSHARED_GROUP_BY = 'unshared_group_by';
 
+	const SUBJECT_EXPIRED_GROUP = 'expired_group';
+
 	/** @var IGroupManager */
 	protected $groupManager;
 
@@ -73,6 +76,8 @@ class Groups extends Base {
 			$subject = $this->l->t('{actor} shared with group {group}');
 		} else if ($event->getSubject() === self::SUBJECT_UNSHARED_GROUP_BY) {
 			$subject = $this->l->t('{actor} removed share for group {group}');
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED_GROUP) {
+			$subject = $this->l->t('Share for group {group} expired');
 		} else {
 			throw new \InvalidArgumentException();
 		}
@@ -104,6 +109,8 @@ class Groups extends Base {
 			$subject = $this->l->t('{actor} shared {file} with group {group}');
 		} else if ($event->getSubject() === self::SUBJECT_UNSHARED_GROUP_BY) {
 			$subject = $this->l->t('{actor} removed group {group} from {file}');
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED_GROUP) {
+			$subject = $this->l->t('Share for file {file} with group {group} expired');
 		} else {
 			throw new \InvalidArgumentException();
 		}
@@ -132,6 +139,7 @@ class Groups extends Base {
 				];
 			case self::SUBJECT_SHARED_GROUP_SELF:
 			case self::SUBJECT_UNSHARED_GROUP_SELF:
+			case self::SUBJECT_EXPIRED_GROUP:
 				return [
 					'file' => $this->getFile($parameters[0], $event),
 					'group' => $this->generateGroupParameter($parameters[1]),
diff --git a/apps/files_sharing/lib/Activity/Providers/Users.php b/apps/files_sharing/lib/Activity/Providers/Users.php
index 61f169fd092a96502161e2fb0ce779aeebba022f..8f30f2cdc08aeba069ea922e5b96cd87c7696998 100644
--- a/apps/files_sharing/lib/Activity/Providers/Users.php
+++ b/apps/files_sharing/lib/Activity/Providers/Users.php
@@ -38,6 +38,9 @@ class Users extends Base {
 	const SUBJECT_SELF_UNSHARED = 'self_unshared';
 	const SUBJECT_SELF_UNSHARED_BY = 'self_unshared_by';
 
+	const SUBJECT_EXPIRED_USER = 'expired_user';
+	const SUBJECT_EXPIRED = 'expired';
+
 	/**
 	 * @param IEvent $event
 	 * @return IEvent
@@ -63,7 +66,10 @@ class Users extends Base {
 			$subject = $this->l->t('Shared by {actor}');
 		} else if ($event->getSubject() === self::SUBJECT_UNSHARED_BY) {
 			$subject = $this->l->t('{actor} removed share');
-
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED_USER) {
+			$subject = $this->l->t('Share for {user} expired');
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED) {
+			$subject = $this->l->t('Share expired');
 		} else {
 			throw new \InvalidArgumentException();
 		}
@@ -103,6 +109,10 @@ class Users extends Base {
 			$subject = $this->l->t('{actor} shared {file} with you');
 		} else if ($event->getSubject() === self::SUBJECT_UNSHARED_BY) {
 			$subject = $this->l->t('{actor} removed you from the share named {file}');
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED_USER) {
+			$subject = $this->l->t('Share for file {file} with {user} expired');
+		} else if ($event->getSubject() === self::SUBJECT_EXPIRED) {
+			$subject = $this->l->t('Share for file {file} expired');
 
 		} else {
 			throw new \InvalidArgumentException();
@@ -125,6 +135,8 @@ class Users extends Base {
 		switch ($subject) {
 			case self::SUBJECT_SHARED_USER_SELF:
 			case self::SUBJECT_UNSHARED_USER_SELF:
+			case self::SUBJECT_EXPIRED_USER:
+			case self::SUBJECT_EXPIRED:
 				return [
 					'file' => $this->getFile($parameters[0], $event),
 					'user' => $this->getUser($parameters[1]),
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 2a2c64cf3834905ea4d9c116d7e4302abd94a444..2e8e6f9a3af73a622da390eb1b2777b706afbc51 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -1313,8 +1313,7 @@ class Manager implements IManager {
 	}
 
 	protected function checkExpireDate($share) {
-		if ($share->getExpirationDate() !== null &&
-			$share->getExpirationDate() <= new \DateTime()) {
+		if ($share->isExpired()) {
 			$this->deleteShare($share);
 			throw new ShareNotFound($this->l->t('The requested share does not exist anymore'));
 		}
diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php
index f9b548c1adf9857fca7bca7ba0141ebddd1871df..9ce88b5af2285ac675664f084fe55859abab13dc 100644
--- a/lib/private/Share20/Share.php
+++ b/lib/private/Share20/Share.php
@@ -368,6 +368,14 @@ class Share implements \OCP\Share\IShare {
 		return $this->expireDate;
 	}
 
+	/**
+	 * @inheritdoc
+	 */
+	public function isExpired() {
+		return $this->getExpirationDate() !== null &&
+			$this->getExpirationDate() <= new \DateTime();
+	}
+
 	/**
 	 * @inheritdoc
 	 */
diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php
index 60bbe31d406477f11f72a4533f92b79a092c1ff7..3b16fcaec0f14881690c4039b741765dfd87ba1b 100644
--- a/lib/public/Share/IShare.php
+++ b/lib/public/Share/IShare.php
@@ -314,6 +314,14 @@ interface IShare {
 	 */
 	public function getExpirationDate();
 
+	/**
+	 * Is the share expired ?
+	 *
+	 * @return boolean
+	 * @since 18.0.0
+	 */
+	public function isExpired();
+
 	/**
 	 * set a label for a share, some shares, e.g. public links can have a label
 	 *