diff --git a/apps/dav/lib/Migration/RemoveOrphanEventsAndContacts.php b/apps/dav/lib/Migration/RemoveOrphanEventsAndContacts.php
index 17643587904fbc5356631f568ec695697909e987..3b5b7bc8ac74135f6336f61276db6c59faf94d02 100644
--- a/apps/dav/lib/Migration/RemoveOrphanEventsAndContacts.php
+++ b/apps/dav/lib/Migration/RemoveOrphanEventsAndContacts.php
@@ -55,6 +55,11 @@ class RemoveOrphanEventsAndContacts implements IRepairStep {
 		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendars',  'calendarid');
 		$output->info(sprintf('%d changes without a calendar have been cleaned up', $orphanItems));
 
+		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendarsubscriptions',  'calendarid');
+		$output->info(sprintf('%d cached events without a calendar subscription have been cleaned up', $orphanItems));
+		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendarsubscriptions',  'calendarid');
+		$output->info(sprintf('%d changes without a calendar subscription have been cleaned up', $orphanItems));
+
 		$orphanItems = $this->removeOrphanChildren('cards', 'addressbooks',  'addressbookid');
 		$output->info(sprintf('%d contacts without an addressbook have been cleaned up', $orphanItems));
 		$orphanItems = $this->removeOrphanChildren('cards_properties', 'cards',  'cardid');
@@ -70,6 +75,12 @@ class RemoveOrphanEventsAndContacts implements IRepairStep {
 			->from($childTable, 'c')
 			->leftJoin('c', $parentTable, 'p', $qb->expr()->eq('c.' . $parentId, 'p.id'))
 			->where($qb->expr()->isNull('p.id'));
+
+		if (\in_array($parentTable, ['calendars', 'calendarsubscriptions'], true)) {
+			$calendarType = $parentTable === 'calendarsubscriptions' ? CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION : CalDavBackend::CALENDAR_TYPE_CALENDAR;
+			$qb->andWhere($qb->expr()->eq('c.calendartype', $qb->createNamedParameter($calendarType, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
+		}
+
 		$result = $qb->execute();
 
 		$orphanItems = array();